如何从分类变量生成虚拟变量?含州与年份交互项实现方法
嘿,这个问题我在Stata里处理过好多次,给你分享几个实用的实现方法,你可以根据自己的需求选:
tab命令生成交叉虚拟变量 这是最直接高效的方式,tab命令支持同时传入两个分类变量,直接生成所有州-年份组合的虚拟变量:
tab state_id year, gen(state_year_)
默认情况下,这个命令会自动排除第一个州-年份组合作为基准组(不会生成对应的虚拟变量)。如果你需要生成所有州-年份组合的虚拟变量(包括基准组),加上noomit选项即可:
tab state_id year, gen(state_year_) noomit
生成的变量会以state_year_1、state_year_2...的形式命名,你可以通过tab state_id year的输出对应到每个变量代表的具体州-年份组合。
xi命令生成带直观命名的交互项 xi命令是Stata里用来处理分类变量交互的经典工具,它生成的变量名会直接体现对应的州和年份,可读性更强:
xi: i.state_id*i.year
执行后,你会看到类似_Istate_idXyear_1_2005这样的变量,其中1是州ID,2005是年份,一眼就能看懂这个变量代表的是2005年第1州的虚拟变量。
如果想给生成的变量加统一前缀(避免和现有变量重名),可以用prefix参数:
xi, prefix(interact_): i.state_id*i.year
这样生成的交互变量就会变成interact__Istate_idXyear_1_2005的形式。
如果你想先确认所有州-年份组合的情况,或者需要对组合变量做额外处理,可以先用egen的group()函数生成一个组合分类变量,再生成虚拟变量:
// 生成州-年份的组合分组变量 egen state_year_group = group(state_id year) // 基于分组变量生成虚拟变量 tab state_year_group, gen(state_year_) noomit
这个方法的好处是,你可以先通过tab state_year_group查看所有组合的分布情况,确认没有异常组合后再生成虚拟变量,适合数据质量需要验证的场景。
如果你的州和年份数量很少,也可以手动生成州和年份的虚拟变量后,通过循环两两相乘得到交互项:
// 先生成州的虚拟变量 tab state_id, gen(s_) local n_state = r(r) // 存储州的数量 // 先生成年份的虚拟变量 tab year, gen(y_) local n_year = r(r) // 存储年份的数量 // 循环生成交互项 forvalues i=1/`n_state' { forvalues j=1/`n_year' { gen s`i'_y`j' = s_`i' * y_`j' } }
不过这个方法在州或年份数量较多时会生成大量冗余变量,而且运行效率低,不推荐用于大样本数据。
内容的提问来源于stack exchange,提问作者Yan Song

