2012-11-23 44 views
4

在運行model0時發現下面我收到一條錯誤消息「eval(expr,envir,enclos)中的錯誤:找不到函數」滯後「。發佈此消息之前,我已經掃描了此論壇和網頁,但未找到相關解決方案。我相信我的模型中的錯誤可能不是由於Lag函數,因爲下面顯示的其他模型(1和2)可以運行而不會遇到任何問題。錯誤:找不到函數「滯後」

我的主要動機是通過循環列出解釋變量及其滯後來運行GAM模型。

library(quantmod) 
library(gamair) 
library(mgcv) 
data(chicago) 

names(chicago) 

varlist0 <- c("pm10median", "pm25median", "o3median", "so2median") 

model0<- lapply(varlist0, function(x) { 
    gam(substitute(death ~ s(time,bs="cr",k=200)+ s(tmpd,bs="cr") + Lag(i,0:4) , list(i = as.name(x))),family=quasipoisson,na.action=na.omit, data=chicago) 

}) 

邯+滯後,並沒有錯誤消息:

model1<- gam(death ~ s(time,bs="cr",k=200)+ s(tmpd,bs="cr") + Lag(pm10median, 0:4),family=quasipoisson,na.action=na.omit, data=chicago) 

LM將和滯後,沒有錯誤消息:

hsb2 <- read.csv("http://www.ats.ucla.edu/stat/data/hsb2.csv") 
varlist <- names(hsb2)[8:11] 
models <- lapply(varlist, function(x) { 
    lm(substitute(read ~ Lag(i,0:4) , list(i = as.name(x))), data = hsb2) 
}) 

我無法破譯這個原因錯誤。我在第一個模型中做了什麼錯誤?

+2

感謝您的可重複的例子! –

回答

3

我不能說確切的原因,但它與mgcv正在評估公式的環境有關。比substitute更安全的方法是做類似如下的事情:

varlist0 <- c("pm10median", "pm25median", "o3median", "so2median") 
model0 <- lapply(varlist0,function(v) { 
    f <- sprintf("death ~ s(time,bs='cr',k=200)+s(tmpd,bs='cr') + Lag(%s,0:4)",v) 
    gam(as.formula(f),family=quasipoisson,na.action=na.omit,data=chicago) 
}) 
+0

非常感謝。你的代碼完美無瑕。用這個模糊的錯誤信息掙扎着我整個下午。我很感謝你的幫助。 – Meso