使用Statsmodels构建OLS模型,如何让Anova结果显示原自变量列名?
解决OLS模型公式构建与系数列名显示问题
你遇到的核心问题是没正确利用statsmodels公式接口的特性——当指定data参数后,公式里可以直接引用数据框的列名,不需要用anovaData["col1"]这种写法,这也是导致系数列名显示异常的原因。
正确的公式构建方式
有两种简单方法能实现你想要的效果,让系数列名显示为真实列名:
方法1:手动拼接自变量列名
如果自变量列不多,直接在公式里用+连接所有自变量:
import statsmodels.api as sm from statsmodels.formula.api import ols # 直接用列名构建公式,data参数指定数据集 model = ols('col1 ~ col2 + col3 + col4 + col5', data=anovaData).fit()
方法2:通过列表动态生成公式
如果自变量列较多或者已经存在列表里,可以用字符串拼接生成公式:
import statsmodels.api as sm from statsmodels.formula.api import ols # 自变量列名列表 indep_vars = ['col2', 'col3', 'col4', 'col5'] # 动态拼接公式字符串 formula = f'col1 ~ {" + ".join(indep_vars)}' # 拟合模型 model = ols(formula, data=anovaData).fit()
为什么你之前的写法会导致列名异常?
你之前的代码ols('anovaData["col1"] ~ anovaData[y]', data=anovaData)相当于直接在公式里传入了一个数组对象,statsmodels无法识别这个数组里每个列的原始名称,只能用anovaData[y][0]这种索引形式标记系数。而当你在公式里直接使用列名时,statsmodels会自动从data参数指定的数据集中提取对应列,并保留列名作为系数的标签,输出就会和你期望的一致。
验证输出
拟合完成后运行print(model.summary()),就能得到你想要的系数列名格式:
==================================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------------ Intercept -0.0177 0.013 -1.319 0.190 -0.044 0.009 col2 0.0003 0.001 0.211 0.833 -0.002 0.003 col3 -0.0007 0.000 -3.829 0.000 -0.001 -0.000 col4 0.0032 0.001 2.853 0.005 0.001 0.005 col5 -0.0008 0.000 -2.162 0.032 -0.002 -7.22e-05
内容的提问来源于stack exchange,提问作者Rrptm
相关产品推荐
相关产品推荐

