我想知道如何捕获公式中使用的响应变量的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
变量是使用命令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
答案 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)
}