5

一些预编程模型会自动删除其回归输出(例如lm())中的线性因变量R。使用该bife软件包,这似乎是不可能的。如第 5 页CRAN中的包装说明所述:

如果 bife 不收敛,这通常表明一个或多个回归变量与固定效应之间存在线性相关性。在这种情况下,您应该仔细检查您的模型规格。

现在,假设手头的问题涉及进行许多回归,并且无法充分检查每个回归输出——必须假设某种关于回归量的经验法则。有哪些替代方法可以或多或少地自动删除线性相关回归器并实现适当的模型规范?

我设置了一个代码作为下面的示例:

#sample coding

x=10*rnorm(40)
z=100*rnorm(40)

df1=data.frame(a=rep(c(0,1),times=20), x=x, y=x, z=z, ID=c(1:40), date=1, Region=rep(c(1,2, 3, 4),10))
df2=data.frame(a=c(rep(c(1,0),times=15),rep(c(0,1),times=5)), x=1.4*x+4, y=1.4*x+4, z=1.2*z+5, ID=c(1:40), date=2, Region=rep(c(1,2,3,4),10))
df3=rbind(df1,df2)

df3=rbind(df1,df2)

for(i in 1:4) {
  
  x=df3[df3$Region==i,]
  
  model =  bife::bife(a ~ x + y + z | ID, data = x)
  
  results=data.frame(Region=unique(df3$Region))
  
  results$Model = results

  if (i==1){
      df4=df
      next
  }

df4=rbind(df4,df)

  
} 

Error: Linear dependent terms detected!
4

1 回答 1

5

由于您只查看线性依赖关系,因此您可以简单地利用检测它们的方法,例如lm.

这是使用包的解决方案示例fixest

library(bife)
library(fixest)

x = 10*rnorm(40)
z = 100*rnorm(40)

df1 = data.frame(a=rep(c(0,1),times=20), x=x, y=x, z=z, ID=c(1:40), date=1, Region=rep(c(1,2, 3, 4),10))

df2 = data.frame(a=c(rep(c(1,0),times=15),rep(c(0,1),times=5)), x=1.4*x+4, y=1.4*x+4, z=1.2*z+5, ID=c(1:40), date=2, Region=rep(c(1,2,3,4),10))

df3 = rbind(df1, df2)

vars = c("x", "y", "z")

res_all = list()
for(i in 1:4) {
    x = df3[df3$Region == i, ]

    coll_vars = feols(a ~ x + y + z | ID, x, notes = FALSE)$collin.var
    new_fml = xpd(a ~ ..vars | ID, ..vars = setdiff(vars, coll_vars))
    res_all[[i]] = bife::bife(new_fml, data = x)
}

# Display all results
for(i in 1:4) {
    cat("\n#\n# Region: ", i, "\n#\n\n")
    print(summary(res_all[[i]]))
}

这里需要的函数是feolsxpd,两者都来自fixest。一些解释:

  • feols,如lm,在发现变量共线时即时删除它们。它将共线变量的名称存储在插槽中$collin.var(如果没有找到,则为NULL)。

  • 与 相反lmfeols也允许固定效果,因此您可以在查找线性依赖项时添加它:这样您就可以发现也涉及固定效果的复杂线性依赖项。

  • 我已经设置了notes = FALSE否则feols会提示一个关于共线性的注释。

  • feols速度很快(实际上比lm大型数据集更快),因此不会对您的分析造成压力。

  • 该函数xpd扩展公式并将任何以两个点开头的变量名称替换为用户提供的相关参数。

    • 当 的参数xpd是向量时,行为是用加号强制它们,所以如果..vars = c("x", "y")提供,公式a ~ ..vars | ID将变为a ~ x + y | ID.

    • 在这里,它..vars在公式中替换为setdiff(vars, coll_vars)),这是未发现共线的变量的向量。

bife因此,在执行估计之前,您会得到一个自动去除变量的算法。

最后,只是一个旁注:通常最好将结果存储在列表中,因为它避免了副本。

更新

我忘了,但如果你不需要偏差校正(bife::bias_corr),那么你可以直接使用fixest::feglm自动删除共线变量:

res_bife = bife::bife(a ~ x + z | ID, data = df3)
res_feglm = fixest::feglm(a ~ x + y + z | ID, df3, family = binomial)

rbind(coef(res_bife), coef(res_feglm))
#>                x          z
#> [1,] -0.02221848 0.03045968
#> [2,] -0.02221871 0.03045990
于 2020-11-16T12:00:02.247 回答