我有这个数据集 https://gist.github.com/natemiller/42eaf45747f31a6ccf9a
我正在尝试使用动态包中的rollapply
来应用滚动回归,遵循rollapply
帮助中的示例并继续获得我想象的简单错误,但我避开了一个能够解决。
如果我将上述数据加载为“dat”,那么我就这样做了。
dat$Date<-as.POSIXct(dat$Date, format="%m/%d/%y %H:%M")
library(zoo)
roll<-rollapply(dat, width = 6, FUN = function(d) coef(lm(Temp~Date, data=d)), align="right")
我收到了错误
Error in eval(predvars, data, env) : invalid 'envir' argument
dat
应该是lm
的适当输入,此lm
在rollapply
之外工作,因此错误出现在rollapply
本身。我认为它很简单,但我很感激帮助。
感谢
答案 0 :(得分:1)
首先,我认为你所做的事情没有意义。 您尝试使用6个值进行回归。
发生错误是因为您没有为lm
提供良好的环境。 d 是一个长度为6的原子矢量,或者您需要一个包含2列Temp和date的data.frame。例如,第一个d是:
d
9.5 9.5 9.5 9.5 9.5 9.5
将lm
应用于此d,您将重现错误:
lm(Temp~Date, data=d)
Error in eval(predvars, data, env) :
numeric 'envir' arg not of length one
您没有当前滚动窗口的Date
,您只有值。
答案 1 :(得分:1)
试试这个:
library(zoo)
dat <- read.zoo("sampleTempData.csv", header = TRUE, sep = ",",
index = 2, tz = "", format = "%m/%d/%y %H:%S")
Seq <- zoo(seq_along(dat), time(dat))
coefs <- rollapply(Seq, 6, function(ix) coef(lm(dat ~ time(dat), subset = ix)))
ADDED:海报添加到问题所以此处附加代码。请注意,我们使用POISIXct
作为日期/时间,因此与coefs
zoo对象关联的时间单位以秒为单位,与输入格式无关。最后我们将秒数转换为数天。见?aggregate.zoo
colnames(coefs) <- c("Intercept", "slope")
Seq.coefs <- zoo(1:nrow(coefs), time(coefs))
max.coefs <- function(ix) coefs[which.max(coefs[ix, 2]), ]
ag <- aggregate(Seq.coefs, as.Date, max.coefs)
transform(ag, slope = slope * 24 * 3600)