如何计时降低 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(.)))
我想对我的数据进行时间贬值,以便通过 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(.)))