【问题标题】:How to run regressions on multidimensional panel data in R如何在 R 中对多维面板数据进行回归
【发布时间】:2018-05-06 21:22:11
【问题描述】:

我需要对面板数据进行回归。它有 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 似乎无法处理超过 2 维的问题。

我试过了

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。

【问题讨论】:

  • 如果你想控制另一个维度,只需为其添加一个虚拟对象

标签: r multidimensional-array panel plm


【解决方案1】:

我觉得你也可以这样做:

df <-transform(df, ID = as.numeric(interaction(comp, count, drop=TRUE))) 

然后估计

result <- plm(value.y ~ value.x, data = df, index = ("ID","year"))

【讨论】:

    【解决方案2】:

    这个问题很像这样:

    你可能不想创建一个新的 dummy,然后使用 dplyr 包你可以使用 group_indices 函数。虽然它不支持mutate,但下面的方法很简单:

    fakedata$id <- fakedata %>% group_indices(comp, count)
    

    id 变量将是您的第一个面板维度。因此,您需要将 plm 索引参数设置为 index = c("id", "year")

    对于替代方案,您可以查看以下问题:R create ID within a group

    【讨论】:

    • 非常感谢!有用。但我仍然很困惑:您的解决方案是否使用 "comp" 和 "count" 进行池化,因为 "id" var 看起来像 "comp" 和 "count" 的笛卡尔积?解决方案可以分别解决“comp”和“count”的效果,而不是集体解决吗? (我希望我已经说清楚了……)
    • 这是一个笛卡尔积,你是对的。但我承认我无法理解您问题的第二部分......您是否愿意将“美国”中的“A”公司视为与“加拿大”中的“A”公司不同?
    • 您的回答建议的计量经济学模型是 'Y_ict = beta * X_ict + f_ic + g_t + h_i + epsilon_ict' ,不是吗? (i:公司。c:国家。t:年份。Y_ict:i、c 和 t 的 value.y。X_ict 是相似的。f_ic:您创建的 id var 的 FE。g_t:时间 FE。h_i:公司的 FE %%当您在 plm%% 的公式中添加因子(公司)时。我只是不太确定结果是否与“Y_ict = beta * X_ict + j_c + g_t + h_i + epsilon_ict”完全相同。 (希望你这样理解)
    • 事实上,我建议的 'id' var 将来自不同国家的公司视为不同。
    • dplyr 0.7.4 开始,您可以在mutate 中使用group_indices。所以OP可以做fakedata &lt;- fakedata %&gt;% mutate(id = group_indices(., comp, count))
    【解决方案3】:

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

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

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

    【讨论】:

    • 这个建议对我不起作用。数据结构和OP的问题一样。
    【解决方案4】:

    我认为您想使用lm() 而不是plm()。这篇博文讨论了您的目标:

    https://www.r-bloggers.com/r-tutorial-series-multiple-linear-regression/

    对于你的例子,我想它看起来像下面这样:

    lm(formula = comp ~ count + year, data = dataname)
    

    【讨论】:

    • OLS 对于面板数据不是最优的,因为它既不针对特定于实体的固定效应进行调整,也不针对错误的自相关进行调整。面板回归 (plm) 确实是 OP 可以尝试的一种选择
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2017-12-07
    • 2021-08-05
    • 2021-09-26
    • 2020-05-25
    • 2015-07-21
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多