如何计时降低 R 中的数据(按组降低)?

How to time demean data in R (demean by group)?

我想对我的数据进行时间贬值,以便通过 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 

如何修改我的代码来让时间贬低 运行ning?我也在寻找一种针对多个变量自动执行此操作的方法(而不是一遍又一遍地重复 mutate )。谢谢

“总均值”问题似乎无法重现。至于在多列中重复 de-meaning ,您可以使用 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 

这里有一个选项mutate_at

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