R 在xts对象上执行多变量动态NLM

R 在xts对象上执行多变量动态NLM,r,time-series,regression,R,Time Series,Regression,我试图在xts对象中执行此操作,但得到一个错误。使用的库和数据包括: #Libraries library(xts) library(dynlm) #Data index <- seq.Date(from = Sys.Date() - 999, to = Sys.Date(), by = "days") x <- xts(1:1000, order.by = index) y <- xts(2001:3000, order.by = index) z <- xts(30

我试图在xts对象中执行此操作,但得到一个错误。使用的库和数据包括:

#Libraries
library(xts)
library(dynlm)

#Data
index <- seq.Date(from = Sys.Date() - 999, to = Sys.Date(), by = "days")
x <- xts(1:1000, order.by = index)
y <- xts(2001:3000, order.by = index)
z <- xts(3001:4000, order.by = index)
data <- merge(x,y,z)
有什么想法吗?或者我应该把信息转换成数据帧,然后从那里开始工作。
提前谢谢

一种方法是使用dyn软件包。请确保未加载dplyr,因为dplyr使用与R的其余部分不兼容的自己的版本覆盖lag

library(dyn)
dyn$lm(x ~ lag(y) + lag(z, 4), data = data)
给予:

Call:
lm(formula = dyn(x ~ lag(y) + lag(z, 4)), data = data)

Coefficients:
(Intercept)       lag(y)    lag(z, 4)  
      -1999            1           NA  

dynlm似乎不能很好地处理“xts”对象

Grothendieck给出的一个解决方案建议使用另一个有效的包

另一种解决方案是将对象更改为zoo

然而,这是令人困惑的,因为我最初工作的对象是类:xts zoo;而dynlm也没有认出“动物园”那部分

把它改成“动物园”后,如果有人想留下来,一切都会正常

#Libraries
library(xts)
library(dynlm)

#Data
index <- seq.Date(from = Sys.Date() - 999, to = Sys.Date(), by = "days")
x <- xts(1:1000, order.by = index)
y <- xts(2001:3000, order.by = index)
z <- xts(3001:4000, order.by = index)
data <- merge(x,y,z)

data.zoo <- zoo(data, order.by = index(data))

dynlm(x ~ L(y) + L(z,4), data = data.zoo)

奇怪的是,得到的截距是不同的。

它们不同的原因是我忘记了lag.xts的作用方向与R基部的lag相反,因此使用lag.xts滞后1。而在R基部,它是lagy,-1。我认为这是xts中的一个设计错误。如果他们想使用不同的约定,他们真的应该使用不同的名称,而不是lag。无论如何,我已经确定了我的答案。请注意,如果要将数据转换为zoo,可以使用as.zoodata。
#Libraries
library(xts)
library(dynlm)

#Data
index <- seq.Date(from = Sys.Date() - 999, to = Sys.Date(), by = "days")
x <- xts(1:1000, order.by = index)
y <- xts(2001:3000, order.by = index)
z <- xts(3001:4000, order.by = index)
data <- merge(x,y,z)

data.zoo <- zoo(data, order.by = index(data))

dynlm(x ~ L(y) + L(z,4), data = data.zoo)
Time series regression with "zoo" data:
Start = 2017-05-23, End = 2020-02-12

Call:
dynlm(formula = x ~ L(y) + L(z, 4), data = data.zoo)

Coefficients:
(Intercept)         L(y)      L(z, 4)  
      -1999            1           NA