You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:47:31