无法修复“ ValueError:DataFrame构造函数未正确调用!”

时间:2019-09-21 13:57:47

标签: python pandas numpy statistics linear-regression

要求我按照以下步骤编写线性回归程序。

  1. 将R数据集mtcars加载为熊猫数据框。
  2. 考虑自变量wt的对数和因变量mpg的对数,构建另一个线性回归模型。
  3. 使模型适合数据,并显示R平方值

我是使用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构造函数未正确调用!]

4 个答案:

答案 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)