我发现了很多有关横截面放宽的问题,但是我没有将它们正确地应用于R中的情况。我有一个具有面板结构(id + year)的数据框,并且我必须贬低我所有的解释变量在数据框中按以下方式操作:
其中X_it是给定时间点的解释变量,而X_it是同一时间点处的横截面的加权平均,而W_it是加权变量。
这是迄今为止我尝试过的例子:
# A random data frame
df1 <- read.table(text="Country Year X1 X2 W
A 1990 10 20 40
A 1991 12 15 NA
A 1992 14 17 41
A 1993 17 NA 44
B 1990 20 NA 45
B 1991 NA 13 61
B 1992 12 12 67
B 1993 14 10 68", header=TRUE, stringsAsFactors=FALSE)
其中X1
和X2
应该由加权平均值来表示,权重为W
。例如,在1990年从X1
的表现值之上应用公式将是:10-(10 * 40 + 20 * 45)/ 40 + 45 = -5.29。理想情况下,应将已降低的值添加到单独列中的数据帧中,即添加为dMX1
。
我的方法是在函数中使用weighted.mean
,例如:
demean <- colwise(function(x) if(is.numeric(x)) x - weighted.mean(x, df1$W) else x)
df2 <- ddply(df1, .(Year), demean)
但是,我总是会收到此错误:
Error in weighted.mean.default(x, df1$W): 'x' and 'w' must have the same length
我不知道R是否仅按Year将说明变量分组,而不按权重变量W
分组?还是我使用错误的功能来完成这项工作?
非常感谢您的帮助!
答案 0 :(得分:0)
使用dplyr
:
df1 %>%
group_by(Year) %>%
mutate_at(vars(contains("X")), funs(dm = . - weighted.mean(., W, na.rm = TRUE)))
# A tibble: 8 x 7
# Groups: Year [4]
Country Year X1 X2 W X1_dm X2_dm
<chr> <int> <int> <int> <int> <dbl> <dbl>
1 A 1990 10 20 40 -5.29 0
2 A 1991 12 15 NA NA NA
3 A 1992 14 17 41 1.24 3.10
4 A 1993 17 NA 44 1.82 NA
5 B 1990 20 NA 45 4.71 NA
6 B 1991 NA 13 61 NA NA
7 B 1992 12 12 67 -0.759 -1.90
8 B 1993 14 10 68 -1.18 0
使用不同的列名称对数据进行采样:
df2 <- read.table(text="Country Year X1 Z2 W
A 1990 10 20 40
A 1991 12 15 NA
A 1992 14 17 41
A 1993 17 NA 44
B 1990 20 NA 45
B 1991 NA 13 61
B 1992 12 12 67
B 1993 14 10 68", header=TRUE, stringsAsFactors=FALSE)
df2 %>%
group_by(Year) %>%
mutate_at(.vars = vars(dplyr::matches("(X)|(Z)")), funs(dm = . - weighted.mean(., W, na.rm = TRUE)))
# A tibble: 8 x 7
# Groups: Year [4]
Country Year X1 Z2 W X1_dm Z2_dm
<chr> <int> <int> <int> <int> <dbl> <dbl>
1 A 1990 10 20 40 -5.29 0
2 A 1991 12 15 NA NA NA
3 A 1992 14 17 41 1.24 3.10
4 A 1993 17 NA 44 1.82 NA
5 B 1990 20 NA 45 4.71 NA
6 B 1991 NA 13 61 NA NA
7 B 1992 12 12 67 -0.759 -1.90
8 B 1993 14 10 68 -1.18 0