2014-10-09 1 views
3

Я выполнил линейную регрессию на языке С, используя библиотеку GSL. Я выполнил ту же регрессию в R. Я могу получить доступ к значениям p для этой регрессии в R, используя команду «summary».Как рассчитать значения р линейной регрессии с учетом ковариационной матрицы и коэффициентов подгонки

В C у меня есть ковариационная матрица, сумма квадратов значений остаточных значений и коэффициентов подгонки. Используя их, как я могу рассчитать значения p?

Я попытался этот подход с использованием «Getting p-value for linear regression in C gsl_fit_linear() function from GSL library»

Может кто-нибудь подтвердить это справедливость? Результаты дает различаются для меня по сравнению с R.

Я изолировал эту строку кода C, как неправильно, но я не могу понять, почему:

double pv0=t0<0?2*(1-gsl_cdf_tdist_P(-t0,n-2)):2*(1-gsl_cdf_tdist_P(t0,n-2));//This is the p-value of the constant term 

Результаты приведены на R:

Коэффициенты:

  Estimate Std. Error t value Pr(>|t|) 
(Intercept) -700.000 226.569 -3.090 0.05373 . 
x    60.000  6.831 8.783 0.00311 ** 

Результаты, приведенные C:

Coefficients Estimate Std. Error t value Pr(>|t|) 
(Intercept) -700.000000 226.568606 -3.089572 -550099700.000000 
      x 60.000000 6.831301 8.783101 -4.000000 
+0

Спасибо за форматирование @ ben-bolker – kobrien

+1

Что-то определенно выглядит фиктивным. Можете ли вы распечатать значения 't0',' n' и 'gsl_cdf_tdist_P (abs (t0), n-2)'? (Я думаю, что у вас есть 'abs' в стандартной математической библиотеке, верно?) –

+0

t0 = -3.089572, n = 5, gsl_cdf_tdist_P (abs (t0), n-2) = 0.0 – kobrien

ответ

2

gsl_cdf_tdist_P следует ожидать два double аргументов и возвращает double между 0 и 1.

Проверьте все типы первыми.

Если он возвращает значения за пределами 0-1, когда все типы верны, есть какая-то серьезная проблема.

+0

Да, это был недостающий заголовок, который ввернул типы, поскольку компиляторы C предполагают, что функции возвращают ints, когда они не могут быть уверены. – kobrien

1

Оказывается, я компилировался без предупреждений, и я не видел, что gsl_cdf_tdist_P был объявлен неявным образом. Это заставило компилятор думать, что функция должна возвращать целое число. Я включил соответствующий заголовок gsl и получил значения, соответствующие R.