基于Dataframe的OLS模型ANOVA结果自由度等数值错误排查
问题原因与解决方法
错误原因
你的Mix列是整数数值类型,statsmodels的OLS公式默认将数值型变量视为连续自变量,因此拟合的是Texture随Mix线性变化的简单线性回归模型,这时候Mix对应的自由度为1(仅对应线性项的单个参数),而非分类变量应有的11个自由度(12个水平-1)。
解决方法
有两种方式可以让statsmodels将Mix当作分类变量处理:
方式1:在OLS公式中用C()包裹变量
修改公式,明确指定Mix为分类变量:
import numpy as np import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols df = pd.read_csv('contrastExampleData.csv') # 用C(Mix)指定分类变量 mod = ols(formula='Texture ~ C(Mix)', data=df).fit() aov_table = sm.stats.anova_lm(mod, typ=1) print(aov_table)
方式2:提前将Mix列转换为分类类型
先把DataFrame中的Mix列转为category类型,再拟合模型:
import numpy as np import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols df = pd.read_csv('contrastExampleData.csv') # 转换为分类类型 df['Mix'] = df['Mix'].astype('category') mod = ols(formula='Texture ~ Mix', data=df).fit() aov_table = sm.stats.anova_lm(mod, typ=1) print(aov_table)
经过上述处理后,Mix的自由度会变为11,得到符合预期的ANOVA结果。
内容的提问来源于stack exchange,提问作者Farooq Zahid
相关产品推荐
相关产品推荐

