Модифицируйте обычную функцию hpfilter, чтобы игнорировать na - PullRequest
4 голосов
/ 29 октября 2011

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

> head(USDATAq)
         tq   ngdp    rgdp  profit
1947 Q1   0  237.2  1770.7    20.7
1947 Q2   1  240.4  1768.0    23.9
1947 Q3   2  244.5  1766.5    23.8
1947 Q4   3  254.3  1793.3    25.5
1948 Q1   4  260.3  1821.8    29.4
1948 Q2   5  267.3  1855.3    31.2

Я применяю функцию hpfilter для фильтрации. В другом месте на этом сайте я обнаружил, что эта реализация использует функцию coredata для применения hpfilter к объектам xts:

hpfilter <- function(x, lambda=2){
  eye <- diag(length(x))
  dcrossprod <- crossprod(diff(eye, lag=1, d=2))
  coredata(x) <- solve(eye + lambda * dcrossprod, coredata(x))
  return(x)
}

Мой вопрос:

Как я могу изменить функцию так, чтобы она работала с переменными, имеющими наблюдения NA (в настоящее время она вычисляет NA для всего диапазона дат, если есть какое-либо NA)?

Я могу передать набор данных как na.omit(USDATAq), который работает, но это сокращает все переменные в наборе данных до минимума наблюдений.Но разные переменные доступны до разных дат, за которыми следуют NA.Я хотел бы в конечном итоге применить функцию к каждому столбцу набора данных в цикле или mapply, чтобы функция возвращала каждый отфильтрованный ряд, используя все доступные наблюдения этого ряда.

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Спасибо @ ran2.Я работал над вашим предложением и сумел решить проблему, но довольно неэкранировано.Прежде всего, я не смог заставить ни одну из функций «применить семейство» правильно работать с объектом xts, поддерживая его структуру.Простое применение с применением (x, MARGIN = 2, ..) для приложения по столбцам показало обещание, но остановилось в операторе 'coredata'.и т. д. дали искаженные списки.

Затем я пошел в цикл.Но поскольку x <-na.omit (x) изменяет длину переменной, он не может заменить оригинал в цикле.</p>

> for(i in 1:ncol(USDATAq)) {
+ USDATAq[,i]<-hpfilter(USDATAq[,i])
+ }

Ошибка в NextMethod (.Generic): количество заменяемых элементов не кратно длине замены

Итак, мне пришлось добавить неподобающий код вhpfilter, чтобы «объединить» результат с исходным (с помощью NA), а затем вернуть переменную.Это слияние сопоставляет 2 переменные по дате (следовательно, по длине), заполняя NA результатом.Затем этот результат может заменить оригинал в цикле.В заключение мне пришлось изменить hpfilter на:

hpfilter <- function(x,lambda=2){
y<-na.omit(x)
eye <- diag(length(y))
coredata(y) <- solve(eye + lambda * crossprod(diff(eye, lag=1, d=2)), coredata(y))
xy<-merge(x,y) 
return(xy[,2])
}

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

1 голос
/ 29 октября 2011

Я думаю, вы на правильном пути.Почему бы просто не добавить na.omit внутри этой функции?Непосредственно перед созданием матрицы eye?x<-na.omit(x).Тогда все, что вам нужно сделать, это передать в него одномерные ряды вместо целых data.frames.Другими словами: оставьте функцию как есть, добавьте na.omit и объедините ее с lapply (или любой другой формой семейства apply (spply, tapply, lapply), которая вам подходит.

0 голосов
/ 14 января 2014

С объектами зоопарка это немного чище, используя attributes(), а не coredata(), тогда вы можете слиться обратно в объект зоопарка.(Я не пробовал это для объектов XTS):

hpfilter <- function(x,lambda=1600){
    y<-na.omit(x)
    eye <- diag(length(y))
    result <- solve(eye+lambda*crossprod(diff(eye,lag=1,d=2)),y)
    attributes(result) <- attributes(y)
    return(result)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...