Я нашел довольно много вопросов о смещении поперечного сечения, но мне не удается правильно применить их к моему случаю в R. У меня есть фрейм данных со структурой панели (id + год), и я должен унижать все мои объясняющие переменные в кадре данных следующим образом:
где 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
? Или я работаю с неправильной функцией, чтобы получить эту работу?
Я очень ценю любую помощь!