繁体   English   中英

如何对 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 

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

似乎“大中庸”问题是不可重现的。 至于在多列中重复去含义,您可以使用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(.)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM