python - R和Python中的线性回归-同一问题的不同结果
问题描述
我正在用 Python 训练我在 R 中学到的数据技能。虽然,我对简单的线性回归有疑问
气候变化数据: [链接在这里]
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 调整。R平方:0.964
方法:最小二乘 F 统计量:123.1
日期:2018 年 10 月 1 日,星期一概率(F 统计):9.54e-20
时间:14:52:53 对数似然:46.898
观察次数:36 AIC:-77.80
Df 残差:28 BIC:-65.13
Df 型号:8
协方差类型:非稳健
梅 0.0361
二氧化碳 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
概率(综合):0.015
雅克-贝拉(JB):10.511偏斜:-0.546 概率(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
Coefficients: MEI 0.036056 CO2 0.004817
CH4 -0.002366 N2O -0.013007 CFC-11 -0.033194 CFC-12 0.037775 TSI 0.009100 Aerosols 70.463329 Residual standard error: 0.07594 on 27 degrees of freedom Multiple R-squared: 0.5346, Adjusted R-squared: 0.3967 F-统计数据:8 和 27 DF 上的 3.877,p 值:0.003721
问题
它们之间的R平方差异很大,自变量的系数也有一点差异。有人可以解释为什么吗?
解决方案
只是指出这一点:statsmodel
默认情况下,最小二乘拟合不包括常数。如果我们从 R 的拟合中删除常量,我们会得到与 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
推荐阅读
- c# - .NET Google OAuth2 集成问题
- android - 如何在 React Navigation 中的 Stack Navigation 中添加抽屉
- r - 使用 dplyr 在 data.frame 中查找逐行最小正非零数
- git - 不允许分支离开分支?
- c# - asp.net, c#, 用户提供的连接字符串和查询
- c++ - c++ 在指针为空时调用对象方法有效
- google-assist-api - Google 环聊对话 ID
- python - 在 Tensorboard 上显示图像(通过 Keras)
- r - 使用 rlang::sym 和感叹号将字符串传递给函数
- spring - 在百里香叶和弹簧上使用下拉菜单时出错