Правильный способ указания ежеквартальных наблюдений в качестве индекса времени в пакете plm

Я пытаюсь преобразовать квартальные данные, хранящиеся в data.table, в панель data.frame, чтобы подготовить ее для дальнейшего анализа. Но, по-видимому, есть проблема при использовании квартальных дат в качестве измерения времени. Я могу преобразовать их в даты, числа или символы, но is.pconsecutive() не распознает их как квартальные временные ряды, что не позволяет мне использовать определенные функции.

library(zoo)
library(data.table)
dt <- structure(list(Global.Company.Key = c(1380L, 1380L, 1380L, 1380L, 
1380L, 1380L, 1380L, 1380L), Calendar.Data.Year.and.Quarter = structure(c(2000, 
2000.25, 2000.5, 2000.75, 2001, 2001.25, 2001.5, 2001.75), class = "yearqtr"), 
    Calendar.Year.Quarter.Integer = c(10957L, 11048L, 11139L, 
    11231L, 11323L, 11413L, 11504L, 11596L), Year.Date = structure(c(10957, 
    11048, 11139, 11231, 11323, 11413, 11504, 11596), class = "Date")), .Names = c("Global.Company.Key", 
"Calendar.Data.Year.and.Quarter", "Calendar.Year.Quarter.Integer", 
"Year.Date"), row.names = c(NA, -8L), class = c("data.table", 
"data.frame"))
# defined the date index as integer
pdt <- pdata.frame(dt, index = c("Global.Company.Key", "Calendar.Year.Quarter.Integer"))
is.pconsecutive(pdt)
 1380 
 FALSE 

По-видимому, измерение времени анализируется путем проверки того, является ли расстояние между точками данных регулярным и равным единице. Из руководства: «Для оценки последовательности измерение времени интерпретируется как числовое, и данные проверяются на регулярность последовательности с расстоянием 1 между периодами времени для каждого человека (для каждого человека измерение времени может быть интерпретировано как последовательность t, t+1, t+2, ..., где t — целое число)». Итак, каков наилучший и наиболее надежный способ преобразования временных рядов за год и квартал?


r plm
person hannes101    schedule 07.02.2018    source источник


Ответы (2)


pdata.frame не знает квартальных данных и не знает о пакетах услуг, которые предоставляет zoo. Переменные, служащие индексом, приводятся к факторной переменной.

Анализируя то, что делает is.pconsecutive: вам понадобится переменная времени в качестве индекса, который представляет собой «значимый» целочисленный ряд после принуждения фактора сначала к символу, а затем к числовому (это то, что делает is.pconsecutive).

Для вашего примера вам нужен индекс, который дает для этого обычную последовательность: as.numeric(as.character(index(pdt)[[2]])).

Для данных в вашем вопросе вы получаете:

[1] 10957 11048 11139 11231 11323 11413 11504 11596, который не оценивается как последовательный.

Для данных в вашем ответе вы получите следующее:

[1] 1 2 3 4 5 6 7 8, который оценивается как последовательный.

person Helix123    schedule 20.02.2018

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

library(lubridate)
dt[, Time.Index := (year(Calendar.Data.Year.and.Quarter)-2000)*4+quarter(Calendar.Data.Year.and.Quarter)]
pdt <- pdata.frame(dt , index = c("Global.Company.Key", "Time.Index"))
is.pconsecutive(pdt) # <- this then reports TRUE

Это обходной путь, но не так уж плохо, я думаю.

person hannes101    schedule 20.02.2018