2013-03-22 120 views
0

我有这个数据集 https://gist.github.com/natemiller/42eaf45747f31a6ccf9arollapply回归“ENVIR”错误

我试图使用在动物园里包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,这lmrollapply之外工作,所以错误出现在rollapply本身。我认为它很简单,但我会很感激帮助。 谢谢

回答

1

首先,我不认为你做什么是有道理的。 您尝试使用6个值进行回归。

发生此错误是因为您没有给出良好的环境lmd是一个长度为6的原子矢量,或者您需要一个带有2列Temp和日期的data.frame。例如,第一d是:

d 
9.5 9.5 9.5 9.5 9.5 9.5 

与此d应用lm,您重现错误:

lm(Temp~Date, data=d) 
Error in eval(predvars, data, env) : 
    numeric 'envir' arg not of length one 

你没有当前滚动窗口Date,你刚才的值。

+0

抱歉,我rollapply的理解是指定的功能(功能(d))施加到数据帧(在这种情况下,DAT),用作第一输入至rollapply。因此,d将是一个数据框。这就是plyr中的函数(如ddply)似乎能够工作的原因,我想我误解了rollapply中的示例代码如何工作。至于6分的回归,我每10分钟测量一次数据,并希望计算全天的60分钟平均值,所以我坚持用6分回归。 – 2013-03-22 20:58:46

+0

@rollaply不像'plyr'。它更像是“过滤”功能。是一个像你的时间系列移动窗口。宽度参数是窗口的宽度。我不明白你评论的第二部分。你每天有5 * 24的价值,你会改变他们到什么? – agstudy 2013-03-22 21:06:28

+1

谢谢。我想要做的是滚动时间序列,窗口宽度为60分钟(代表6个值,因为它们每10分钟测量一次),并计算每个窗口的温度变化(斜率)。那么我的目标就是确定每天和每天发生的最大斜率。 – 2013-03-22 21:22:14

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))) 

新增:海报加入到这里质疑这样额外的代码。请注意,我们使用日期/时间POISIXct,因此与coefs动物园对象关联的时间单位以秒为单位,与输入格式无关。最后,我们将秒数转换为数天。见?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) 
+0

谢谢!我将时间格式更改为%H:%M不是%S。我实际上是在寻找每天最大的斜率(我没有在我的帖子中说过),所以我扩展了你的代码。日期<-index(coefs); data <-data.frame(date,coefs [,1],coefs [,2]);名称(数据)< - C( “日”, “临时”, “斜率”); library(lubridate); data $ day <-floor_date(data $ date,“day”); library(plyr); ddply(data,。(day),function(d)d [which.max(d $ slope), ]);但斜坡不够大,即使它们是每分钟。温度变化至少为0.5每小时,但斜率(乘以60)仅为〜0.09-0.15。 – 2013-03-25 15:56:33

+0

查看添加的素材。 – 2013-03-25 16:39:36