如何在 R 中对多维面板数据运行回归

2024-04-29

我需要对面板数据进行回归。它有 3 个维度(年份 * 公司 * 国家/地区)。例如:

============================================
 year | comp | count |  value.x |  value.y
------+------+-------+----------+-----------
 2000 |   A  |  USA  |  1029.0  |  239481   
------+------+-------+----------+-----------
 2000 |   A  |  CAN  |  2341.4  |  129333   
------+------+-------+----------+-----------
 2000 |   B  |  USA  |  2847.7  |  187319   
------+------+-------+----------+-----------
 2000 |   B  |  CAN  |  4820.5  |  392039
------+------+-------+----------+-----------
 2001 |   A  |  USA  |  7289.9  |  429481
------+------+-------+----------+-----------
 2001 |   A  |  CAN  |  5067.3  |  589143
------+------+-------+----------+-----------
 2001 |   B  |  USA  |  7847.8  |  958234
------+------+-------+----------+-----------
 2001 |   B  |  CAN  |  9820.0  | 1029385
============================================

然而,R 包plm似乎无法应对超过二维的情况。

我努力了

result <- plm(value.y ~ value.x, data = dataname, index = c("comp","count","year"))

它返回错误:

Error in pdata.frame(data, index) : 
'index' can be of length 2 at the most (one individual and one time index)

当面板数据(个体 * 时间)在“个体”内具有超过 1 个维度时,如何运行回归?


如果有人遇到同样的情况,我将我的解决方案放在这里:

R似乎无法应对这种情况。你唯一能做的就是添加假人。如果您添加虚拟变量所依据的分类变量包含太多类别,您可以尝试以下操作:

makedummy <- function(colnum,data,interaction = FALSE,interation_varnum)
{
  char0 = colnames(data)[colnum]
  char1 = "dummy"
  tmp = unique(data[,colnum])
  valname = paste(char0,char1,tmp,sep = ".")
  valname_int = paste(char0,char1,"int",tmp,sep = ".")
  for(i in 1:(length(tmp)-1))
  {
    if(!interaction)
    {
      tmp_dummy <- ifelse(data[,colnum]==tmp[i],1,0)
    }
    if(interaction)
    {
      index = apply(as.matrix(data[,colnum]),1,identical,y = tmp[i])
      tmp_dummy = c()
      tmp_dummy[index] = data[index,interation_varnum]
      tmp_dummy[!index] = 0
    }
    tmp_dummy <- data.frame(tmp_dummy)
    if(!interaction)
    {
      colnames(tmp_dummy) <- valname[i]
    }
    if(interaction)
    {
      colnames(tmp_dummy) <- valname_int[i]
    }
    data<-cbind(data,tmp_dummy)
  }
  return(data)
}

例如:

## Create fake data
fakedata <- matrix(rnorm(300),nrow = 100)
cate <- LETTERS[sample(seq(1,10),100, replace = TRUE)]
fakedata <- cbind.data.frame(cate,fakedata)

## Try this
fakedata <- makedummy(1,fakedata)

## If you need to add dummy*x to see if there is any influences of different categories on the coefficients, try this
fakedata <- makedummy(1,fakedata,interaction = TRUE,interaction_varnum = 2)

这里可能有点啰嗦,我没有润色。欢迎任何建议。现在您可以对数据执行 OLS。


如果您想控制模型内的另一个维度,只需为其添加一个虚拟值:

plm(value.y ~ value.x + count, data = dataname, index = c("comp","year"))

或者(特别是对于高维数据),请查看lfe可以“吸收”附加维度的包,因此汇总输出不会被虚拟变量污染。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 R 中对多维面板数据运行回归 的相关文章

随机推荐