当使用多变量时间序列作为lm中的数据时,将tsp属性保持在响应变量中

时间:2013-08-29 13:43:32

标签: r lm

我想知道如何捕获公式中使用的响应变量的tsp属性,例如lm

model.frame的帮助下,它表示选项na.action=NULL应保留tsp属性:

  

除非na.action = NULL,否则将删除时间序列属性   找到的变量

但是,如果使用多变量时间序列对象作为数据,情况似乎并非如此。以下是使用lm的示例:

    Seatbelts[,"drivers"]
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
1969 1687 1508 1507 1385 1632 1511 1559 1630 1579 1653 2152 2148
1970 1752 1765 1717 1558 1575 1520 1805 1800 1719 2008 2242 2478
1971 2030 1655 1693 1623 1805 1746 1795 1926 1619 1992 2233 2192
...

out<-lm(drivers~log(PetrolPrice)+law,data=Seatbelts,na.action=NULL,y=TRUE)
out$y
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16  
1687 1508 1507 1385 1632 1511 1559 1630 1579 1653 2152 2148 1752 1765 1717 1558
...

但这有效:

out<-lm(Seatbelts[,"drivers"]~log(PetrolPrice)+law,data=Seatbelts,na.action=NULL,y=TRUE)
out$y
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
1969 1687 1508 1507 1385 1632 1511 1559 1630 1579 1653 2152 2148
1970 1752 1765 1717 1558 1575 1520 1805 1800 1719 2008 2242 2478
1971 2030 1655 1693 1623 1805 1746 1795 1926 1619 1992 2233 2192
...

那么,任何想法如何让第一个案例起作用?在实际情况中,我有自己的函数,它使用公式并使用lmmodel.frame函数提取与model.response函数几乎完全相同的预测变量和响应变量。

在仔细查看问题之后,似乎后一种情况有效,因为model.frame.default变量是使用命令eval(vars, data, env)找到的,而Seatbelts[,"drivers"]不是数据的一部分,它从全局环境中评估,保持tsp属性。在前一种情况下,驱动程序是数据的一部分,在函数中较早地转换为data.frame,这将删除tsp属性。

这是一个简单的问题示例,基本上是model.frame中发生的事情:

data <- as.data.frame(Seatbelts) #this strips tsp attribute from the data
formula <- terms(as.formula(drivers~1), data = data)
env <- environment(formula)
vars <- attr(formula, "variables")
variables <- eval(vars, data, env)
variables[[1]] #no tsp attributes as variable drivers is taken from data

data <- as.data.frame(Seatbelts)
formula <- terms(as.formula(Seatbelts[,"drivers"]~1), data = data)
env <- environment(formula)
vars <- attr(formula, "variables")
variables <- eval(vars, data, env)
variables[[1]] 
# tsp attributes still here, as variable Seatbelts[,"drivers"]
# is not in data, it is taken from global environment

2 个答案:

答案 0 :(得分:2)

试试这个:

library(dyn)
out <- dyn$lm(drivers ~ log(PetrolPrice) + law, data = Seatbelts, na.action = NULL)
y <- fitted(out) + resid(out)
y

或者可以手动修复它:

 out <- lm(drivers ~ log(PetrolPrice) + law, Seatbelts, y = TRUE)
 out$y <- ts(out$y)
 tsp(out$y) <- tsp(Seatbelts)

答案 1 :(得分:0)

我最终做的是,如果调用包含data参数,我会在处理数据之前存储可能的tsp属性:

if (missing(data)) {
  data <- environment(formula)
  tsp_data <- NULL
} else {
  tsp_data <- tsp(data)
  data <- as.data.frame(data)
}

然后我将我的响应变量重新转换为ts对象:

class(y) <- if (p > 1) {
  c("mts", "ts", "matrix")
} else "ts"
if (is.null(tsp(y))) {
  if (!is.null(tsp_data)) {
    tsp(y) <- tsp_data
  } else tsp(y) <- c(1, n, 1)
}