R固定效应回归中year:state与factor(year)*factor(state)的区别
R公式中
:和*操作符的核心差异 首先明确R公式语法的基础规则:
a:b仅表示两个变量的交互项,不会生成主效应a*b是a + b + a:b的简写,会同时生成两个变量的主效应和二者的交互项
两种写法结果存在差异的根本原因
第一种写法的逻辑问题
你的第一种代码为:
reg1 <- lm(x ~ y + z + factor(year) + factor(state) + year:state, data=df)
这里交互项部分直接使用了year:state,如果你的原始数据中year和state为数值类型(比如year存储为2000、2001这类数值,state存储为1、2、3这类编码数值),那么这里的交互项是两个连续变量的乘积项,仅会生成1个回归系数,和你需要的分类变量交互逻辑完全不同。
第二种写法的逻辑
你的第二种代码为:
reg1 <- lm(x ~ y + z + factor(year) + factor(state) + factor(year)*factor(state), data=df)
这里factor(year)*factor(state)会自动展开为factor(year) + factor(state) + factor(year):factor(state),R的公式机制会自动忽略重复的主效应项,最终实际拟合的项包括:控制变量y、z,年份分类主效应,州分类主效应,年份-州分类全交互项,会生成(年份数量-1)*(州数量-1)个交互项系数,和第一种写法的交互项维度、计算逻辑完全不同,因此回归结果存在明显差异。
正确的手动固定效应写法
如果你的需求是加入年份、州主固定效应+年份-州交互固定效应,推荐两种无歧义的写法:
- 显式声明所有项,避免隐式转换出错:
reg1 <- lm(x ~ y + z + factor(year) + factor(state) + factor(year):factor(state), data=df)
- 用
*简写,不需要重复写主效应:
reg1 <- lm(x ~ y + z + factor(year)*factor(state), data=df)
如果你的数据中year和state已经提前转换为factor类型,两种写法的拟合结果完全一致。
内容的提问来源于stack exchange,提问作者moreirasd
相关产品推荐
相关产品推荐

