【问题标题】:How to time demean data in R (demean by group)?如何在 R 中对数据进行时间降级(按组降级)?
【发布时间】:2021-01-17 03:41:02
【问题描述】:

我想通过ordinary least squares (OLS) 手动运行fixed effects 回归来降低我的数据的时间。 “时间贬值”是指计算每单位(例如人)的组均值并减去这个。我认为这段代码可能会完成这项工作,但它会为所有行产生一个大平均值:

set.seed(5)
paneldata = data.frame(id=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), 
                       year=seq(from=2003, to=2009, by=1), 
                       x = runif(14, min = 0, max = 25),
                       y = runif(14, min = 0, max = 25),)

paneldata %>%
  group_by(id) %>%
  mutate(MeanValue = mean(x), 
         tdm_x = x - MeanValue)

# A tibble: 14 x 6
# Groups:   id [2]
      id  year     x     y MeanValue  tdm_x
   <dbl> <dbl> <dbl> <dbl>     <dbl>  <dbl>
 1     1  2003  5.01  6.56      12.4 -7.38 
 2     1  2004 17.1   5.05      12.4  4.74 
 3     1  2005 22.9   9.69      12.4 10.5  
 4     1  2006  7.11 22.2       12.4 -5.28 
 5     1  2007  2.62 13.9       12.4 -9.77 
 6     1  2008 17.5  21.1       12.4  5.14 
 7     1  2009 13.2  22.3       12.4  0.812
 8     2  2003 20.2  18.0       12.4  7.81 
 9     2  2004 23.9   5.28      12.4 11.5  
10     2  2005  2.76  5.64      12.4 -9.63 
11     2  2006  6.83  3.50      12.4 -5.55 
12     2  2007 12.3  12.0       12.4 -0.124
13     2  2008  7.96 10.9       12.4 -4.43 
14     2  2009 14.0  24.1       12.4  1.59 

如何修改我的代码以使时间贬低运行?我也在寻找一种方法来自动处理几个变量(不要一遍又一遍地重复mutate)。谢谢

【问题讨论】:

  • 您发布的代码按预期工作,并没有给出您显示的输出。您可以尝试重新启动您的 R 会话并再次运行上述代码吗?
  • 这解决了我的问题 o.O 以前从未遇到过与 R/dplyr 类似的问题。没关系。如何扩展对变量列表的这种贬低?

标签: r dplyr regression mean


【解决方案1】:

似乎“大均值”问题无法重现。至于跨多个列重复去意义,你可以使用mutate(across())

paneldata %>%
  group_by(id) %>%
  mutate(across(c("x", "y"), ~ .x - mean(.x), .names = "tdm_{col}"))

#> # A tibble: 14 x 6
#> # Groups:   id [2]
#>       id  year     x     y  tdm_x  tdm_y
#>    <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>
#>  1     1  2003  5.01  6.56 -7.21  -7.82 
#>  2     1  2004 17.1   5.05  4.91  -9.34 
#>  3     1  2005 22.9   9.69 10.7   -4.69 
#>  4     1  2006  7.11 22.2  -5.11   7.81 
#>  5     1  2007  2.62 13.9  -9.60  -0.510
#>  6     1  2008 17.5  21.1   5.31   6.67 
#>  7     1  2009 13.2  22.3   0.983  7.87 
#>  8     2  2003 20.2  18.0   7.64   6.66 
#>  9     2  2004 23.9   5.28 11.4   -6.08 
#> 10     2  2005  2.76  5.64 -9.80  -5.72 
#> 11     2  2006  6.83  3.50 -5.73  -7.86 
#> 12     2  2007 12.3  12.0  -0.295  0.637
#> 13     2  2008  7.96 10.9  -4.60  -0.426
#> 14     2  2009 14.0  24.1   1.42  12.8 

【讨论】:

    【解决方案2】:

    这是mutate_at的选项

     library(dplyr)
     paneldata %>%
       group_by(id) %>%
       mutate_at(vars(c("x", "y"), list(tdm = ~ . - mean(.)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2019-01-25
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多