Поперечное сечение в R - PullRequest
       6

Поперечное сечение в R

0 голосов
/ 10 сентября 2018

Я нашел довольно много вопросов о смещении поперечного сечения, но мне не удается правильно применить их к моему случаю в R. У меня есть фрейм данных со структурой панели (id + год), и я должен унижать все мои объясняющие переменные в кадре данных следующим образом:

Equation of a demeaned X

где 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. Например, если применить формулу сверху, значение обесценения, равное X1 в 1990 году, составит: 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 только объясняющие переменные по году, а не весовую переменную W? Или я работаю с неправильной функцией, чтобы получить эту работу?

Я очень ценю любую помощь!

1 Ответ

0 голосов
/ 10 сентября 2018

Использование 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...