如何使用sm.OLS()向线性回归模型添加虚拟/因子变量?
没问题,我来帮你搞定在sm.OLS里加入星期虚拟变量的事儿!这里有两种常用的实用方法,结合你的数据结构给你一步步拆解:
方法1:用pandas的get_dummies()生成虚拟变量
这种方法适合习惯手动构建特征矩阵的场景,步骤清晰可控:
import pandas as pd import statsmodels.api as sm # 假设你的数据已经存在DataFrame df中(这里用你提供的样本数据示例) df = pd.DataFrame({ 'Date': ['2013-05-04', '2013-05-05', '2013-05-06', '2013-05-07', '2013-05-08', '2013-05-09', '2013-05-10', '2013-05-11'], 'A': [25.03, 52.98, 39.93, 47.31, 19.61, 39.51, 21.22, 19.04], 'B': [88.51, 67.99, 75.19, 86.99, 87.94, 83.10, 62.16, 58.79], 'weekday': ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] }) # 生成星期的虚拟变量,drop_first=True避免多重共线性(自动去掉一个基准类别) weekday_dummies = pd.get_dummies(df['weekday'], drop_first=True) # 合并原自变量(A、B)和虚拟变量,再添加截距项(sm.OLS默认不包含截距) X = pd.concat([df[['A', 'B']], weekday_dummies], axis=1) X = sm.add_constant(X) # 替换成你实际的因变量列,这里假设用A作为示例 y = df['A'] # 构建并拟合OLS模型 model = sm.OLS(y, X).fit() # 查看模型结果 print(model.summary())
小提示:drop_first=True会自动移除第一个出现的类别(这里是Saturday)作为基准组,其他星期变量的系数代表该组与基准组的差异,完美避免了多重共线性问题。
方法2:用statsmodels的C()函数直接处理分类变量
如果你喜欢更简洁的公式语法,用smf.ols(公式接口)配合C()函数会更省心,不需要提前生成虚拟变量:
import pandas as pd import statsmodels.formula.api as smf # 同样使用你的样本数据df df = pd.DataFrame({ 'Date': ['2013-05-04', '2013-05-05', '2013-05-06', '2013-05-07', '2013-05-08', '2013-05-09', '2013-05-10', '2013-05-11'], 'A': [25.03, 52.98, 39.93, 47.31, 19.61, 39.51, 21.22, 19.04], 'B': [88.51, 67.99, 75.19, 86.99, 87.94, 83.10, 62.16, 58.79], 'weekday': ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] }) # 公式里用C(weekday)标记这是分类变量,statsmodels会自动处理虚拟变量 model = smf.ols(formula='A ~ B + C(weekday)', data=df).fit() # 查看模型结果 print(model.summary())
进阶技巧:如果你想指定自己的基准类别(比如把Monday作为参考组),可以用Treatment参数:
model = smf.ols(formula='A ~ B + C(weekday, Treatment(reference="Monday"))', data=df).fit()
关键注意事项
- 绝对不要把所有星期的虚拟变量都放进模型,这会导致完全多重共线性,模型无法估计参数,两种方法都帮你自动规避了这个问题。
- 基准类别的选择会影响系数的解释,选一个有代表性的类别(比如工作日的周一)会让结果更易解读。
内容的提问来源于stack exchange,提问作者vestland
相关产品推荐
相关产品推荐

