Дезагрегирование (интерполяция) годовых данных в квартальные данные с помощью R [дубликаты]

Мои данные имеют следующий вид:

df <- data.frame(year=c(1992:2015), share=c(31.9,   36.8,   38.2,   39.9,   36.3,   36.5,   35.6,   35.2,   34.8,   33.2,   33.5,   34.6,   
                                            36.3,   36.2, 38.1, 37.2,   35.9,   33.2,   36.9,   36.0,   33.9,   33.7,   34.3,   35.1))

Данные состоят из средних годовых значений. Я хочу преобразовать данные в средние квартальные значения, предполагая, что изменение является линейным.

Я пытался использовать library("tempdisagg") , но не могу заставить его работать. Я также пробовал некоторые другие подходы с library("splines") в статистике, но безрезультатно. Возможно, потому что я неправильно обрабатываю формат даты и временного ряда.

Чтобы уточнить, ожидаемый результат будет выглядеть примерно так:

y_q     share
1992q1  values
1992q2  values
1992q3  values
1992q4  values
1993q1  values
1993q2  values
1993q3  values
1993q4  values
1994q1  values
1994q2  values
1994q3  values
1994q4  values

Любая помощь приветствуется.


person EconRA    schedule 17.08.2016    source источник


Ответы (2)


Функция "приблизительно" может выполнять линейную интерполяцию значений, необходимых для вывода.

#create sequence of dates
quarter<-seq(as.Date("1992-01-01"), as.Date("2015-01-01"), by="quarter")
#create the linear interploated values
estshare<-approx(df$share, n=length(quarter))
newdf<-data.frame(quaters<-quarter, share<-estshare$y)

В этом случае я предполагаю, что цены на акции были с первого дня года. Если это было среднее значение, вы можете изменить начальную и конечную дату последовательности дат, «квартал» с первого года на середину года.

person Dave2e    schedule 17.08.2016

С линейной годовой интерполяцией вы можете попробовать это с базовым пакетом:

    annual <- data.frame(year=c(1992:2015), share=c(31.9, 36.8, 38.2, 39.9,  36.3, 36.5, 35.6, 35.2, 34.8, 33.2, 33.5, 34.6, 36.3, 36.2, 38.1, 37.2, 35.9, 33.2, 36.9, 36.0, 33.9, 33.7, 34.3, 35.1))
# Annual delta for interpolation
annual$delta<-c(NA, diff(annual$share,1))
# Quarterly table
ref<-data.frame(quarter=paste0("Q", 1:4), nb=1:4)
quart<-merge(annual, ref)
quart<-quart[order(quart$year, quart$quarter),]

# quarterly value calculation with evolution (loop)
quart$quarterly<-NA
quart$quarterly[1:4]<-quart$share[1:4]/4

for (i in (2:dim(annual)[1])) {     
quart$quarterly[quart$year==annual$year[i]] <- sum(quart$quarterly[quart$year==annual$year[i-1]])/4+ (quart$delta[quart$year==annual$year[i]] * quart$nb[quart$year==annual$year[i]])/10
 }
# /10 : /(1+2+3+4)
# Check :
summary(annual$share == aggregate(quarterly ~ year, data=quart, FUN=sum)[,2])
plot(quart$quarterly, typ="l")

Это может быть некрасиво, но я предпочитаю использовать базовые функции, чтобы понять лежащие в их основе, чтобы я мог адаптировать свой код к другим ситуациям.

person Jean-Noël    schedule 18.08.2016