R

时间:2018-09-10 10:13:15

标签: r

我发现了很多有关横截面放宽的问题,但是我没有将它们正确地应用于R中的情况。我有一个具有面板结构(id + year)的数据框,并且我必须贬低我所有的解释变量在数据框中按以下方式操作:

Equation of a demeaned X

其中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)

其中X1X2应该由加权平均值来表示,权重为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分组?还是我使用错误的功能来完成这项工作?

非常感谢您的帮助!

1 个答案:

答案 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