我有一个模型。
library(dlnm)
library(splines)
data(chicagoNMMAPS)
cb1.pm <- crossbasis(chicagoNMMAPS$pm10, lag=15, argvar=list(fun="lin"),
arglag=list(fun="poly",degree=4))
model1 <- glm(death ~ cb1.pm + ns(time, 7*14) + dow,
family=quasipoisson(), chicagoNMMAPS)
pred1.pm1 <- crosspred(cb1.pm, model1, bylag=0.2, cumul=TRUE)
我想使用一个字符向量来调用对象cb1.pm
,所以我尝试了这个。
# use character vector
i = 'pm'
cb1.var = paste0('cb1.', i) %>% get()
model2 <- glm(death ~ cb1.var + ns(time, 7*14) + dow,
family=quasipoisson(), chicagoNMMAPS)
pred1.pm2 <- crosspred(cb1.pm, model2, bylag=0.2, cumul=TRUE) # Error occur here
identical(cb1.pm, cb1.var) # TRUE
结果identical(cb1.pm, cb1.var)
是TURE
,但是为什么这两个变量不能互相替换?
如有任何帮助,我们将不胜感激!
问题是crosspred
使用非标准求值从调用中提取第一个参数的名称,并尝试将其与model2
中的变量匹配。它使用grep
来完成此操作。由于在模型中使用了cb1.var
作为名称,因此crosspred
函数找不到任何包含字符串"的系数;cb1.pm";并抛出错误。
绕过这一点的方法是确保cb1.var
保留为一个符号,并在构建模型之前替换cb1.pm
。这也更有效,因为您不需要复制整个cb1.pm
数据:
i = 'pm'
cb1.var = paste0('cb1.', i)
form <- as.formula(paste("death ~", cb1.var, "+ ns(time, 7*14) + dow"))
model2 <- glm(form, family = quasipoisson(), chicagoNMMAPS)
pred1.pm2 <- crosspred(cb1.pm, model2, bylag = 0.2, cumul=TRUE)
我们不再收到警告,我们可以确认我们有正确的型号:
identical(pred1.pm1, pred1.pm2)
#> [1] TRUE