我正在用python训练我的数据技能,这是我在R中学到的,尽管我对一个简单的线性回归有疑问。
Climate_change数据:[链接此处]
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结果
副警长。变量:温度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脚本
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-平方在它们之间有很大的差异,自变量的系数也有一定的差异。有人能解释原因吗?
发布于 2018-10-02 09:07:55
为了指出这一点:statsmodel的最小二乘拟合在默认情况下不包括常数。如果我们从R的fit中删除该常量,我们得到的结果与Python实现非常相似,或者反过来,如果我们在statsmodel-fit中添加一个常量,则得到类似于R的结果。
删除R's lm-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发布于 2018-10-01 20:10:14
正如评论中提到的那样,这可能是一个基于所发出的警告的多重共线性问题。测试我们是否得到相同的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输出。必须提取感兴趣的参数
https://stackoverflow.com/questions/52596724
复制相似问题