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