Запуск отстающих регрессий с лаппи и двумя аргументами - PullRequest
1 голос
/ 22 сентября 2011

Я использую несколько одномерных регрессий, как в этом воспроизводимом примере:

require(dynlm)
data(USeconomic)
US<-USeconomic
vars<-colnames(US)[-2]
a<-lapply(colnames(US),function(x) dynlm(log(GNP)~get(x),data=US))

a содержит список из 3 одномерных регрессий.Предположим теперь, что я хотел бы запустить те же регрессии с 3 лагами: l<-c(0,1,4), где 0, конечно, случай, который я уже получил.Есть ли способ использовать вектор l напрямую, например

# this did not work for me, I obtain multivariate regressions including all lags at once
lapply(colnames(US),function(x) dynlm(log(GNP)~L(get(x),l),data=US),l=l)

После того, как это не сработало, я попробовал другой подход и добавил к следующему вектору:

lagged_vars <- paste("L(",rep(vars,each=3),",",l,")",sep="")

, чтобы получить:

[1] "L(log(M1),0)" "L(log(M1),1)" "L(log(M1),4)" "L(rs,0)"      "L(rs,1)"     
[6] "L(rs,4)"      "L(rl,0)"      "L(rl,1)"      "L(rl,4)"

К сожалению, я не могу запустить его с новым вектором символов, get () не помогает.Я не могу понять, почему это работает с vars, но не lagged_vars, которые оба являются символьными векторами.

Обратите внимание, что синтаксис L() происходит из пакета dynlm.Дополнительный вопрос: если я просто распечатаю, коэффициенты из результата регрессии остаются помеченными как get (x) - как я могу это изменить?

Цикл i, j мог бы быть возможным решением, но я бы предпочел использовать lapply иличто-то из этого семейства ...

РЕДАКТИРОВАТЬ: as.formula не работает вместе с L() из dynlm.Я получаю следующее сообщение об ошибке:

Ошибка в merge.zoo (log (GNP), L (log (M1), 0), retclass = "list", all = FALSE): не удалось найти функцию "L "

РЕДАКТИРОВАТЬ: нашел интересный пост bei Achim Zeileis , касающийся этой проблемы.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Чтобы построить формулу R, вы должны вставить ее все вместе, а не только в ее предсказатель.Так что вам нужно что-то вроде:

formula <- as.formula(
    paste("log(GNP)~",
        paste("L(",rep(vars,each=3),",",l,")",sep=""),
        sep = ""
    )
)

и затем запустить

dynlm(formula, data = ...)
1 голос
/ 23 сентября 2011

Вот подход, использующий plyr

library(plyr); library(dynlm); library(tseries)

# FUNCTION TO RUN A SINGLE REGRESSION
foo = function(x, l) dynlm(log(GNP) ~ L(get(as.character(x)), l), data = US)

# CREATE PARAMETER GRID
params = expand.grid(x = colnames(US)[-2], l = c(0, 1, 4))

# RUN REGRESSIONS
regressions = mlply(params, foo)

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

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