python statsmodel.api.OLS()与R lm()的比较
我从python statsmodels.api.OLS()和R lm()中得到了非常不同的结果,它们在相同的数据上运行。R的结果与我的预期相符,在python中没有那么多。我肯定有些基本的东西我误解了。。。非常感谢您的帮助 Pythonpython statsmodel.api.OLS()与R lm()的比较,python,r,statsmodels,Python,R,Statsmodels,我从python statsmodels.api.OLS()和R lm()中得到了非常不同的结果,它们在相同的数据上运行。R的结果与我的预期相符,在python中没有那么多。我肯定有些基本的东西我误解了。。。非常感谢您的帮助 Python import statsmodels.formula.api as smf import pandas as pd df = pd.DataFrame({'date': [1.5488064e+18, 1.5043968e+18],
import statsmodels.formula.api as smf
import pandas as pd
df = pd.DataFrame({'date': [1.5488064e+18, 1.5043968e+18],
'count': [15.0, 12.0]})
fit = smf.ols('count~date', data=df).fit()
new_data = pd.DataFrame({'date': [1.398816e+18, 1.337040e+18]})
new_data['count'] = (fit.predict(new_data))
print(new_data)
结果:
date count
0 1.398816e+18 12.387341
1 1.337040e+18 11.840278
R
df <- data.frame(date=c(1.5488064e+18, 1.5043968e+18),
count=c(15.0, 12.0))
fit <- lm(count~date, data=df)
new_data <- data.frame(date=c(1.398816e+18, 1.337040e+18))
new_data[['count']] <- predict(fit, new_data)
print(new_data)
似乎与和相似,但这些问题中的任何问题都不能解决我的问题。删除常数
拟合您只有两个数据点,需要估计两个参数。默认情况下,StatsModelAPI必须删除截取。把它设为零,以便估计所有其他必要的统计数字。例如,比较python的fit.summary()
和R的summary(fit)
,您会注意到两者是不同的。您需要添加更多数据,或者必须删除Akrunald所示的R拟合模型的截距,当您包含常数时,设计矩阵的比例将非常糟糕,1
与1e+18
相比。statsmodelssummary
应该警告在这种情况下会有一个巨大的条件数。非常感谢这些回答,@Onyanbu(以及akrun和Josef)。有件事我不明白。我的两个数据点定义了一条线,这条线有一个截距。我希望StatsModelAPI能够找到这条线并进行拦截。我知道,由于样本量小,一些拟合统计数据可能不够具体;我希望它会发出警告或错误,或者用NaN或其他东西填充这些统计数据,而不是返回一行不经过我的两点的数据。也许统计模型是这个工作的错误工具。在这种情况下,你必须使用sklearn.linear\u models.LinearRegression
。这将符合这条线,而不需要其他统计数据
date count
1 1.398816e+18 4.8677043
2 1.337040e+18 0.6945525