问题描述
我想对数据进行定时处理,以便通过fixed effects
(OLS)手动运行ordinary least squares
回归。 “时间行为”是指计算单位(例如人)的组均值,并将其减去。我以为这段代码可以完成任务,但是它为所有行产生了平均值:
set.seed(5)
paneldata = data.frame(id=c(1,1,2,2),year=seq(from=2003,to=2009,by=1),x = runif(14,min = 0,max = 25),y = runif(14,)
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",list(tdm = ~ . - mean(.)))