问题描述
我想使用高度不平衡的数据集对虚拟变量进行回归。据我所知,statsmodels无法识别虚拟基础组何时缺失。
例如,假设我在3个时段(t)的3个州(s)中有6个人(i)的结果(y)。如果我的面板平衡,则使用交互的虚拟变量进行回归不会有问题:
dat={'y':[1,2,3,4,5,6,7,8,9,1,9],'i':[1,6],'s':[1,3],'t':[1,3]}
df=pd.DataFrame(dat)
mod = smf.ols(formula='y ~ C(s)*C(t)',data=df)
res=mod.fit()
print(res.params)
Intercept 2.500000e+00
C(s)[T.2] 1.500000e+00
C(s)[T.3] 3.000000e+00
C(t)[T.2] 1.000000e+00
C(t)[T.3] 2.000000e+00
C(s)[T.2]:C(t)[T.2] -1.776357e-15
C(s)[T.3]:C(t)[T.2] -3.108624e-15
C(s)[T.2]:C(t)[T.3] -8.881784e-16
C(s)[T.3]:C(t)[T.3] -1.776357e-15
但是,假设我在时段1中没有状态1的数据。如果我再次运行回归,statsmodels不会识别出交互术语的基群不存在,
df=df[(df.s!=1) | (df.t!=1)]
mod = smf.ols(formula='y ~ C(s)*C(t)',data=df)
res=mod.fit()
print(res.params)
Intercept 3.055556
C(s)[T.2] 0.944444
C(s)[T.3] 2.444444
C(t)[T.2] 0.444444
C(t)[T.3] 1.444444
C(s)[T.2]:C(t)[T.2] 0.555556
C(s)[T.3]:C(t)[T.2] 0.555556
C(s)[T.2]:C(t)[T.3] 0.555556
C(s)[T.3]:C(t)[T.3] 0.555556
其他统计程序(例如,Stata)会自动识别此情况,并将基本组切换为非缺失观测值。有没有办法在statsmodels中做到这一点?
我尝试过:
- 手动分配基组,但是我丢失的数据没有一致的模式,所以这不起作用
- 手动创建伪矩阵并分配基组。首先,这很繁琐并且容易出现编码错误。其次,当我尝试使用Patsy将它们作为字符串输入时,我有足够多的虚拟变量,导致遇到“达到最大递归级别”错误。第三,如果我将它们作为numpy数组而不是公式运行,则无法弄清楚如何为这些虚拟变量分配变量名。由于我需要使用一些系数值,因此不命名它们会增加编码错误的空间。
在任何方面的帮助将不胜感激。谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)