0

我想知道如何捕获公式中使用的响应变量的 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
...

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

在仔细研究问题之后,似乎后一种情况有效,因为model.frame.default使用 command 找到了变量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
4

2 回答 2

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)
于 2013-08-29T15:22:31.287 回答
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)
}
于 2015-09-21T06:44:14.023 回答