Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python statsmodel.api.OLS()与R lm()的比较_Python_R_Statsmodels - Fatal编程技术网

python statsmodel.api.OLS()与R lm()的比较

python 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],

我从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],
                   '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
相比。statsmodels
summary
应该警告在这种情况下会有一个巨大的条件数。非常感谢这些回答,@Onyanbu(以及akrun和Josef)。有件事我不明白。我的两个数据点定义了一条线,这条线有一个截距。我希望StatsModelAPI能够找到这条线并进行拦截。我知道,由于样本量小,一些拟合统计数据可能不够具体;我希望它会发出警告或错误,或者用NaN或其他东西填充这些统计数据,而不是返回一行不经过我的两点的数据。也许统计模型是这个工作的错误工具。在这种情况下,你必须使用
sklearn.linear\u models.LinearRegression
。这将符合这条线,而不需要其他统计数据
          date     count
 1 1.398816e+18 4.8677043
 2 1.337040e+18 0.6945525