首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R和Python中的线性回归-相同问题的不同结果

R和Python中的线性回归-相同问题的不同结果
EN

Stack Overflow用户
提问于 2018-10-01 18:20:14
回答 2查看 2.3K关注 0票数 3

我正在用python训练我的数据技能,这是我在R中学到的,尽管我对一个简单的线性回归有疑问。

Climate_change数据:[链接此处]

Python脚本

代码语言:javascript
复制
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结果

副警长。变量:温度R-平方: 0.972 型号: OLS Adj. .R-平方: 0.964 方法:最小二乘F-统计量: 123.1 日期:2018年10月1日星期一 时间: 14:52:53日志-可能性: 46.898 不是的。意见: 36 AIC:-77.80 Df残差: 28 BIC:-65.13 Df模型:8 协方差类型:非稳健性 梅0.0361 CO2 0.0046 CH4 -0.0023 N2O -0.0141 CFC-11 -0.0312 CFC-12 0.0358 TSI -0.0033 气溶胶69.9680 总括:8.397杜宾-华生: 1.484 Prob(总括):0.015 贾克-贝拉(JB):10.511 倾斜:-0.546 Prob(JB):0.00522 峰度: 5.412 康德。不,6.35e+06

R脚本

代码语言:javascript
复制
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剩余标准差: 0.07594在27自由度倍数R-平方: 0.5346,调整R-平方: 0.3967 F-统计量: 3.877对8和27 DF,p-值: 0.003721

问题

R-平方在它们之间有很大的差异,自变量的系数也有一定的差异。有人能解释原因吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-02 09:07:55

为了指出这一点:statsmodel的最小二乘拟合在默认情况下不包括常数。如果我们从R的fit中删除该常量,我们得到的结果与Python实现非常相似,或者反过来,如果我们在statsmodel-fit中添加一个常量,则得到类似于R的结果。

删除R's lm-call中的常量:

代码语言:javascript
复制
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的调用中添加一个常量:

代码语言:javascript
复制
X_with_constant = sm.add_constant(X)

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

给出了相同的结果:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-10-01 20:10:14

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

代码语言:javascript
复制
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输出。必须提取感兴趣的参数

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52596724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档