【问题标题】:Unable to fix "ValueError: DataFrame constructor not properly called!"无法修复“ValueError:未正确调用 DataFrame 构造函数!”
【发布时间】:2020-01-22 06:10:01
【问题描述】:

我被要求编写一个包含以下步骤的线性回归程序。

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

我是 Python 统计的初学者。

我尝试在不转换为新 DataFrame 的情况下获取日志值,但出现错误提示“TypeError: 'OLS' object is not subscriptable”

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

【问题讨论】:

    标签: python pandas numpy statistics linear-regression


    【解决方案1】:

    这可能对你有用。

    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)
    

    【讨论】:

    • 非常感谢。你是救生员!该程序运行良好。
    【解决方案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()
    

    如果您打印 results_summary,您将看到变量是:Intercept 和 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
    

    【讨论】:

    • 感谢您的解决方案。不幸的是,它没有评估,因为 wt 不存在。无论如何,非常感谢您的回答。
    【解决方案3】:

    解决办法如下:

    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())
    
    

    【讨论】:

      【解决方案4】:

      变化:

      lin_mod2 = pd.DataFrame(lin_mod1)
      

      收件人:

      lin_mod2 = pd.DataFrame(data = lin_mod1)
      

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 2014-10-25
        • 2019-02-11
        • 2021-06-04
        相关资源
        最近更新 更多