要求我按照以下步骤编写线性回归程序。
我是使用Python进行统计的初学者。
我尝试获取日志值而不转换为新的DataFrame,但这给出了一个错误消息,提示“ TypeError:'OLS'对象不可下标”
import statsmodels.api as sa
import statsmodels.formula.api as sfa
import pandas as pd
import numpy as np
cars = sa.datasets.get_rdataset("mtcars")
cars_data = cars.data
lin_mod1 = sfa.ols("wt~mpg",cars_data)
lin_mod2 = pd.DataFrame(lin_mod1)
lin_mod2['wt'] = np.log(lin_mod2['wt'])
lin_mod2['mpg'] = np.log(lin_mod2['mpg'])
lin_res1 = lin_mod2.fit()
print(lin_res1.summary())
预期结果是线性回归后的表,但实际输出是错误
[ValueError:DataFrame构造函数未正确调用!]
答案 0 :(得分:3)
这可能对您有用。
import statsmodels.api as sm
import numpy as np
mtcars = sm.datasets.get_rdataset('mtcars')
mtcars_data = mtcars.data
liner_model = sm.formula.ols('np.log(wt) ~ np.log(mpg)',mtcars_data)
liner_result = liner_model.fit()
print(liner_result.rsquared)
答案 1 :(得分:2)
我破解了您的代码,并逐行运行了它。 问题在这里:
lin_mod1 = sfa.ols("wt~mpg",cars_data)
如果尝试打印,则输出为:
statsmodels.regression.linear_model.OLS object at 0x7f1c64273eb8
并且不能正确地解释以构建数据框架。
解决方案是将第一个线性模型的结果放入表中,最后将其放入数据框中:
results = lin_mod1.fit()
results_summary = results.summary()
如果打印result_summary,您将看到变量为:拦截和mpg。 我不知道这是概念上的错误还是什么,因为它不是“ wt”-“ mpg”对。
# summary as a html table
results_as_html = results_summary.tables[1].as_html()
# dataframe from the html table
lin_mod2 = pd.read_html(results_as_html, header=0, index_col=0)[0]
lin_mod2的打印结果是:
coef std err t P>|t| [0.025 0.975]
Intercept 6.0473 0.309 19.590 0.0 5.417 6.678
mpg -0.1409 0.015 -9.559 0.0 -0.171 -0.111
答案 2 :(得分:1)
解决办法如下:
import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
cars=sm.datasets.get_rdataset("mtcars")
cars_data=cars.data
lin_mod1=smf.ols('np.log(wt)~np.log(mpg)',cars_data)
lin_model_fit=lin_mod1.fit()
print(lin_model_fit.summary())
答案 3 :(得分:0)
更改:
lin_mod2 = pd.DataFrame(lin_mod1)
收件人:
lin_mod2 = pd.DataFrame(data = lin_mod1)