【问题标题】:Rolling regression with unbalanced panel不平衡面板的滚动回归
【发布时间】:2021-03-04 09:39:54
【问题描述】:

我正在尝试根据滚动回归公式计算环境复杂性的度量。 复杂度公式定义如下: 对于一个滚动的三年期,对于行业中的所有公司,年末的销售价值根据年初的销售价值进行回归。回归系数定义为环境复杂度。

这就是我遇到问题的地方:公司在几年之间增加和退出一个行业,使得回归方程中的初始 X 和 Y 在数量上不相等。

为了更好地说明这一点,给定以下示例数据集:

> set.seed(123)
> df <- data.table("Firm" = c("A","B","A","B","C","A","B","C","D","B","C","D","E","F"),
+                  "Year" = c(1980,1980,1981,1981,1981,1982,1982,1982,1982,1983,1983,1983,1983,1983),
+                  "Industry" = rep("I1",14),
+                  "Sale" = sample(1000:1500,14))
> df
    Firm Year Industry Sale
 1:    A 1980       I1 1414
 2:    B 1980       I1 1462
 3:    A 1981       I1 1178
 4:    B 1981       I1 1013
 5:    C 1981       I1 1194
 6:    A 1982       I1 1425
 7:    B 1982       I1 1305
 8:    C 1982       I1 1117
 9:    D 1982       I1 1298
10:    B 1983       I1 1228
11:    C 1983       I1 1243
12:    D 1983       I1 1497
13:    E 1983       I1 1373
14:    F 1983       I1 1152

要衡量 1983 年的复杂性,我必须查看 1981-1983 年的时间跨度。但是,1983 年该行业有 5 家公司,1981 年有 3 家公司,它们之间只有两家共同公司(B 和 C)。 因此,要测量 1983 年的复杂性,我必须首先只选取公司 B 和 C,然后将它们在 1983 年(1228 和 1243)的销售价值回归到它们在 1981 年(1178 和 1013)的销售价值,这将导致系数0.08287293.

所需的输出应如下所示:

> df
    Firm Year Industry Sale    compx
 1:    A 1980       I1 1414       NA
 2:    B 1980       I1 1462       NA
 3:    A 1981       I1 1178       NA
 4:    B 1981       I1 1013       NA
 5:    C 1981       I1 1194       NA
 6:    A 1982       I1 1425 -2.50000
 7:    B 1982       I1 1305 -2.50000
 8:    C 1982       I1 1117 -2.50000
 9:    D 1982       I1 1298 -2.50000
10:    B 1983       I1 1228 0.08287293
11:    C 1983       I1 1243 0.08287293
12:    D 1983       I1 1497 0.08287293
13:    E 1983       I1 1373 0.08287293
14:    F 1983       I1 1152 0.08287293

我为行业添加了一个变量,因为我想为每个行业迭代过程。 data.table 解决方案会很棒,因为我的数据集相当大。

非常感谢。

编辑:抱歉,我输入了错误的所需输出。现在已编辑。

【问题讨论】:

    标签: r recursion datatable data.table rolling-computation


    【解决方案1】:

    一个简单的解决方案是编写一个fit 函数,该函数获取数据的一个子集,使用dcast 对其进行整形以将第一年和去年作为单独的列,运行回归并提取系数。然后,您可以循环多年并将其合并回您的主数据集。

    这里有两种不同的方法。第一个在开始和结束时进行整形。第二个在循环内重塑。

    第一:

    df_wide <- dcast(df, Firm + Industry ~ Year, value.var="Sale")
    
    for (i in ncol(df_wide):3) {
      if (i < 5) {
        df_wide[[i]] <- NA_real_
      } else {
        f <- paste0("`", colnames(df_wide)[i], "`~`", colnames(df_wide)[i-2], "`")
        f <- as.formula(f)
        df_wide[[i]] <- coef(lm(f, df_wide))[2]
      }
    }
    
    melt(df_wide, 
         id.vars=c("Firm", "Industry"), 
         variable.name="Year",
         value.name="compx")
        
    

    第二:

    fit <- function(year=1980) {
      year_min <- year - 2
      year_max <- year 
      if (all(year_min:year_max %in% df$Year)) {
        tmp <- df[Year %in% year_min:year_max]
        tmp <- dcast(tmp, Firm + Industry ~ Year, value.var="Sale")
        f <- as.formula(paste0("`", year_max, "`~`", year_min, "`"))
        out <- coef(lm(f, tmp))[2]
      } else {
        out <- NA
      }
      out <- data.table(Year=year, compx=out)
      return(out)
    }
    
    results <- list()
    for (y in 1980:1985) {
      results[[y]] <- fit(y)
    }
    results <- rbindlist(results)
    
    merge(df, results, on="Year")
    #>     Year Firm Industry Sale       compx
    #>  1: 1980    A       I1 1414          NA
    #>  2: 1980    B       I1 1462          NA
    #>  3: 1981    A       I1 1178          NA
    #>  4: 1981    B       I1 1013          NA
    #>  5: 1981    C       I1 1194          NA
    #>  6: 1982    A       I1 1425 -2.50000000
    #>  7: 1982    B       I1 1305 -2.50000000
    #>  8: 1982    C       I1 1117 -2.50000000
    #>  9: 1982    D       I1 1298 -2.50000000
    #> 10: 1983    B       I1 1228  0.08287293
    #> 11: 1983    C       I1 1243  0.08287293
    #> 12: 1983    D       I1 1497  0.08287293
    #> 13: 1983    E       I1 1373  0.08287293
    #> 14: 1983    F       I1 1152  0.08287293
    

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2017-01-14
      • 2014-10-30
      • 1970-01-01
      • 2019-06-18
      • 2020-06-07
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多