c - 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值

标签 c linear-regression gsl

我正在尝试在 C 中重新生成一些来自 R 的代码,因此我正在尝试使用 gsl_fit_linear() 函数来拟合线性回归。

在 R 中,我将使用 lm() 函数,它使用以下代码返回拟合的 p 值:

lmAvgs<- lm( c(1.23,   11.432,   14.653, 21.6534) ~ c(1970, 1980, 1990, 2000) )
summary(lmAvgs)

我不知道如何从 C 输出到 p 值,到目前为止我的代码看起来像这样:

int main(void)
{
int i, n = 4;
double x[4] = { 1970, 1980, 1990, 2000 };
double y[4] = {1.23,   11.432,   14.653, 21.6534};
double c0, c1, cov00, cov01, cov11, sumsq;
gsl_fit_linear (x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
}

这似乎可以正确计算斜率和截距,但我不知道如何获得 p 值。我是统计和 C 的新手!

最佳答案

一切都在:http://en.wikipedia.org/wiki/Ordinary_least_squares .但这里有一段代码,它在 R 中显示类似于 summary(lmAvgs) 的输出。要运行它,您需要 GSL Library :

int n = 4;
double x[4] = { 1970, 1980, 1990, 2000};
double y[4] = {1.23,   11.432,   14.653, 21.6534};
double c0, c1, cov00, cov01, cov11, sumsq;
gsl_fit_linear (x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);

cout<<"Coefficients\tEstimate\tStd. Error\tt value\tPr(>|t|)"<<endl;

double stdev0=sqrt(cov00);
double t0=c0/stdev0;
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
cout<<"Intercept\t"<<c0<<"\t"<<stdev0<<"\t"<<t0<<"\t"<<pv0<<endl;

double stdev1=sqrt(cov11);
double t1=c1/stdev1;
double pv1=t1<0?2*(1-gsl_cdf_tdist_P(-t1,n-2)):2*(1-gsl_cdf_tdist_P(t1,n-2));//This is the p-value of the linear term
cout<<"x\t"<<c1<<"\t"<<stdev1<<"\t"<<t1<<"\t"<<pv1<<endl;

double dl=n-2;//degrees of liberty
double ym=0.25*(y[0]+y[1]+y[2]+y[3]); //Average of vector y
double sct=pow(y[0]-ym,2)+pow(y[1]-ym,2)+pow(y[2]-ym,2)+pow(y[3]-ym,2); // sct = sum of total squares
double R2=1-sumsq/sct;
cout<<"Multiple R-squared: "<<R2<<",    Adjusted R-squared: "<<1-double(n-1)/dl*(1-R2)<<endl;
double F=R2*dl/(1-R2);
double p_value=1-gsl_cdf_fdist_P(F,1,dl);
cout<<"F-statistic:  "<<F<<" on 1 and "<<n-2<<" DF,  p-value: "<<p_value<<endl;

给出:

Coefficients    Estimate    Std. Error  t value Pr(>|t|)
Intercept   -1267.91    181.409 -6.98922    0.0198633
x   0.644912    0.0913886   7.05681 0.0194956
Multiple R-squared: 0.961389,   Adjusted R-squared: 0.942083
F-statistic:  49.7986 on 1 and 2 DF,  p-value: 0.0194956

R 给出:

Coefficients:
Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -1.268e+03  1.814e+02  -6.989   0.0199 *
c(1970, 1980, 1990, 2000)  6.449e-01  9.139e-02   7.057   0.0195 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.044 on 2 degrees of freedom
Multiple R-squared: 0.9614, Adjusted R-squared: 0.9421 
F-statistic:  49.8 on 1 and 2 DF,  p-value: 0.01950 

关于c - 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5503733/

相关文章:

c - UDP 服务器收不到数据

c - 使用 GSL 计算矩阵的克罗内克积的有效方法

c - 为什么当我增加 UART 波特率时,字节之间的延迟会增加?

c - 从二维字符数组初始化指向字符的指针数组

c - %qu 格式在 printf() 中代表什么

python - 线性回归\梯度下降python实现

python - python 线性回归中字符串的预测

c - GNU GSL 对两个 vector 进行排序

gcc - 使用 g++ 编译 GSL odeiv2