Я работаю с несбалансированными временными рядами поперечных сечений с неравномерными интервалами. Моя цель - получить вектор скользящего среднего с запаздыванием для вектора «Количество», сегментированный по «Тема».
Другими словами, предположим, что для Субъекта_1 были соблюдены следующие Количественные характеристики: [1,2,3,4,5]. Сначала мне нужно отстать на 1, получая [NA, 1,2,3,4].
Затем мне нужно взять скользящее среднее 3-го порядка, получив [NA, NA, NA, (3 + 2 + 1) / 3, (4 + 3 + 2) / 3]
Вышеуказанное необходимо сделать для всех субъектов.
# Construct example balanced panel DF
panel <- data.frame(
as.factor(sort(rep(1:6,5))),
rep(1:5,6),
rnorm(30)
)
colnames(panel)<- c("Subject","Day","Quantity")
#Make panel DF unbalanced
panelUNB <- subset(panel,as.numeric(Subject)!= Day)
panelUNB <- panelUNB[-c(15,16),]
Если бы панель была сбалансированной, я бы сначала задержал переменную «Количество», используя пакет plm
и функциюlag
. Затем я бы взял скользящую среднюю «Quanatity» с задержкой, например, используя функцию rollmean
из пакета zoo
:
panel$QuantityMA <- ave(panel$Quantity, panel$Subject, FUN = function(x) rollmean(
x,3,align="right",fill=NA,na.rm=TRUE))
Это даст правильный результат при применении к сбалансированному «панельному» DF.
Проблема в том, что plm
и lag
полагаются на равномерное распределение рядов для создания индексной переменной, в то время как rollapply требует, чтобы количество наблюдений (размер окна) было одинаковым для всех субъектов.
На StackExchange есть решение с data.table, которое намекает на решение моей проблемы: Получение скользящего среднего несбалансированного набора панельных данных
Возможно, это решение можно модифицировать для получения скользящего среднего фиксированной длины вместо «скользящего кумулятивного среднего».