首页 文章

R和Python中的线性回归 - 在同一问题上的结果不同

提问于
浏览
2

我正在训练我在py中学习我的数据技能,这是我在R中学到的 . 虽然,我对一个简单的线性回归有疑问

气候变化数据:[link here]

Python脚本

import os
import pandas as pd
import statsmodels.api as sm



train = df[df.Year>=2006]

X = train[['MEI', 'CO2', 'CH4', 'N2O', 'CFC.11', 'CFC.12', 'TSI', 'Aerosols']]
y = train[['Temp']]
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
model.summary()

Python结果

Dep . 变量:温度R平方:0.972型号:OLS Adj . R平方:0.964方法:最小二乘法F统计量:123 . 1日期:星期一,2018年10月1日Prob(F统计量):9.54e-20时间:14:52:53对数似然:46.898否观察:36 AIC :-77.80 Df残差:28 BIC:-65.13 Df型号:8协方差类型:非粗糙MEI 0.0361 CO2 0.0046 CH4 -0.0023 N2O -0.0141 CFC-11 -0.0312 CFC-12 0.0358 TSI -0.0033气溶胶69.9680 Omnibus:8.397 Durbin-Watson: 1.484 Prob(Omnibus):0.015 Jarque-Bera(JB):10.511偏斜:-0.546 Prob(JB):0.00522峰度:5.412 Cond . 第6.35e 06号

R脚本

train <- climate_change[climate_change$Year>=2006,]
prev <- lm(Temp ~ ., data = train[,3:NCOL(train)])
summary(prev)

R结果

残差:最小1Q中位数3Q最大值-0.221684 -0.032846 0.002042 0.037158 0.167887系数:MEI 0.036056 CO2 0.004817 CH4 -0.002366 N2O -0.013007 CFC-11 -0.033194 CFC-12 0.037775 TSI 0.009100气溶胶70.463329残余标准误差:27自由度为0.07594多个R平方:0.5346,调整后的R平方:0.3967 F-统计:8和27 DF时为3.877,p值:0.003721

问题

R平方它们之间有很大差异,自变量系数也有一点差异 . 有人可以解释为什么吗?

2 回答

  • 0

    只是指出这一点: statsmodel 's least squares fit does by default not include a constant. If we remove the constant from R'适合,我们得到与Python实现非常相似的结果,或者相反,如果我们向 statsmodel -fit添加一个常量,我们得到类似于 R 的结果:

    删除 Rlm -call中的常量:

    summary(lm(Temp ~ . - 1, data = train[,3:NCOL(train)]))
    
    Call:
    lm(formula = Temp ~ . - 1, data = train[, 3:NCOL(train)])
    
    Residuals:
          Min        1Q    Median        3Q       Max 
    -0.221940 -0.032347  0.002071  0.037048  0.167294 
    
    Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
    MEI       0.036076   0.027983   1.289   0.2079  
    CO2       0.004640   0.008945   0.519   0.6080  
    CH4      -0.002328   0.002132  -1.092   0.2843  
    N2O      -0.014115   0.079452  -0.178   0.8603  
    `CFC-11` -0.031232   0.096693  -0.323   0.7491  
    `CFC-12`  0.035760   0.103574   0.345   0.7325  
    TSI      -0.003283   0.036861  -0.089   0.9297  
    Aerosols 69.968040  33.093275   2.114   0.0435 *
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 0.07457 on 28 degrees of freedom
    Multiple R-squared:  0.9724,    Adjusted R-squared:  0.9645 
    F-statistic: 123.1 on 8 and 28 DF,  p-value: < 2.2e-16
    

    让我们为 statsmodel 的调用添加一个常量:

    X_with_constant = sm.add_constant(X)
    
    model = sm.OLS(y, X_with_constant).fit()
    model.summary()
    

    给我们相同的结果:

    OLS Regression Results
    Dep. Variable:  Temp    R-squared:  0.535
    Model:  OLS Adj. R-squared: 0.397
    Method: Least Squares   F-statistic:    3.877
    Date:   Tue, 02 Oct 2018    Prob (F-statistic): 0.00372
    Time:   10:14:03    Log-Likelihood: 46.899
    No. Observations:   36  AIC:    -75.80
    Df Residuals:   27  BIC:    -61.55
    Df Model:   8       
    Covariance Type:    nonrobust       
    coef    std err t   P>|t|   [0.025  0.975]
    const   -17.8663    563.008 -0.032  0.975   -1173.064   1137.332
    MEI 0.0361  0.029   1.265   0.217   -0.022  0.095
    CO2 0.0048  0.011   0.451   0.656   -0.017  0.027
    CH4 -0.0024 0.002   -0.950  0.351   -0.007  0.003
    N2O -0.0130 0.088   -0.148  0.884   -0.194  0.168
    CFC-11  -0.0332 0.116   -0.285  0.777   -0.272  0.205
    CFC-12  0.0378  0.123   0.307   0.761   -0.215  0.290
    TSI 0.0091  0.392   0.023   0.982   -0.795  0.813
    Aerosols    70.4633 37.139  1.897   0.069   -5.739  146.666
    Omnibus:    8.316   Durbin-Watson:  1.488
    Prob(Omnibus):  0.016   Jarque-Bera (JB):   10.432
    Skew:   -0.535  Prob(JB):   0.00543
    Kurtosis:   5.410   Cond. No.   1.06e+08
    
  • 1

    正如评论中所提到的,基于给出的警告,它可能是多重共线性的问题 . 测试我们是否获得相同r平方的一种方法是使用另一个包 sklearn 并基于 LinearRegression 模块构建模型

    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import r2_score
    
    regr = LinearRegression()
    regr.fit(X, y)
    predictions = regr.predict(X)
    r2_score(y, predictions)
    #0.5345800653144226
    

    但是, LinearRegression 不会给出任何 summary 输出 . 必须提取感兴趣的参数

相关问题