【问题标题】:Efficiency in time-series regression in R: How can I do this better?R中时间序列回归的效率:我怎样才能做得更好?
【发布时间】:2012-02-19 18:32:02
【问题描述】:

我正在研究时间序列,并想检查所有滞后差异的显着性(本质上是手动进行 dickey-fuller 测试),但这并不重要。我可以做到,但它真的很机械,必须有一种方法可以更优雅地做到这一点。或者至少更有效。有什么想法吗?

y <- log.real.gdp.ts

delta.y.t <- diff(y,differences=1)
lag.y <- lag(y, -1)
L1Dy <- lag(delta.y.t, k=-1)
L2Dy <- lag(delta.y.t, k=-2)    
L3Dy <- lag(delta.y.t, k=-3)    
L4Dy <- lag(delta.y.t, k=-4)    
L5Dy <- lag(delta.y.t, k=-5)    
L6Dy <- lag(delta.y.t, k=-6)    
L7Dy <- lag(delta.y.t, k=-7)    
L8Dy <- lag(delta.y.t, k=-8)    
L9Dy <- lag(delta.y.t, k=-9)    
L10Dy <- lag(delta.y.t, k=-10)  
L11Dy <- lag(delta.y.t, k=-11)  
L12Dy <- lag(delta.y.t, k=-12)  

d = ts.union(delta.y.t, lag.y, L1Dy, L2Dy, L3Dy, L4Dy, L5Dy, L6Dy, L7Dy, L8Dy, L9Dy, L10Dy, L11Dy, L12Dy)               ## takes care of NA's

lm.model.III <- lm(delta.y.t~ lag.y + time(lag.y) + L1Dy + L2Dy + L3Dy + L4Dy + L5Dy + L6Dy + L7Dy + L8Dy + L9Dy + L10Dy + L11Dy + L12Dy, data=d)

我真的很想要某种循环,我可以在其中生成 1:n 滞后差异,然后以某种方式将所有 n 插入我的线性模型中,例如

 lm.model.III <- lm(delta.y.t ~ lag.y + time(lag.y) + lagged.diffs.mts)

【问题讨论】:

    标签: r time-series regression


    【解决方案1】:

    dynlm 包将时间序列运算符的处理添加到 R 公式中:

    dynlm 的接口和内部结构与lm 非常相似,但是 目前dynlm 与直接使用lm 相比具有三个优势: 1. 扩展公式处理,2.时间序列的保存 属性,3. 工具变量回归(通过两阶段最小 方格)。为了指定要拟合的模型的公式,有 有额外的功能,可以方便 动态规范(通过d()L())或线性/循环 模式(通过trend()season()harmon())。全新配方 函数要求它们的参数是时间序列对象(即, “ts”或“zoo”)。

    这是一个例子:

    library(foreign)
    library(zoo)
    library(dynlm)
    
    dfKlein = read.dta('http://www.stata-press.com/data/r12/klein.dta')
    summary(dfKlein)
    
    zooKlein = as.zoo(dfKlein, order.by = dfKlein$year)
    lmKlein = dynlm(consump ~ L(profits, 1) + profits + wagetot, 
                    data = zooKlein)
    summary(lmKlein)
    

    请特别注意,它允许您在公式对象中指定滞后向量,例如y ~ L(y, 1:4)

    【讨论】:

      【解决方案2】:

      如何
      require(zoo)
      
      delta.y.t <- diff(y,differences=1)
      lag.y <- lag(y, -1)
      L1Dy <- lag(delta.y.t, -(0:12), na.pad=T)
      
      #for any regression you can then access the number of lags you want:
      # 0 lag and na.pad=T are crucial
      
      lm(lag.y ~ L1Dy[,1:5])
      

      希望对你有帮助

      -chris

      【讨论】:

      • 您需要y的变化。尝试set.seed(4); y=zoo(cumprod((1+rnorm(200,0.1,0.3)))); plot(y)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多