将变化的 for 循环变量插入模型公式
Inserting changing for-loop variable into model formula
我有以下功能:
sincos.chooser <- function(mod,min,max) {
my.aic.sincos <- matrix(NA, ncol=2, nrow=max)
for(k in c(min:max)) {
sincos.update <- update(mod, .~. + I(cos(2*pi/k*(order.ID))) + I(sin(2*pi/k*(order.ID))))
my.aic.sincos[k,] <- c(k,AIC(sincos.update))
}
my.aic.sincos
}
但是当我 运行 函数时,我得到以下错误:
Error in get("k") : object 'k' not found
如何在循环的更新函数中识别变化的变量 k?
我假设这里的问题是更新函数假定 "k" 是我的 data.frame 中的列名,因此找不到该对象。我希望它将 "k" 视为变量,而不是参数名称。
更新:我尝试使用 get('k')
代替 "k." 如果我将 update
函数移到我的 "sincos.chooser" 函数,但是在 in 我的函数中使用时会产生与上面相同的错误。
对于那些想要查看我的数据和模型的人:
原型号:
gls(GDD ~ year + pdo, data = dat)
我的数据格式:
> dat
year month temp.avg ppt.avg GDD pdo order.ID
1 1922 1 0.4935484 0.3535484 14.40737 -0.45 1
2 1923 2 4.3892857 0.4542857 56.03017 -1.51 2
3 1924 3 7.3032258 0.5435484 106.49244 -1.76 3
4 1925 4 12.8533333 0.2583333 239.07739 -1.71 4
5 1926 5 19.7903226 0.4667742 458.50000 -1.61 5
6 1927 6 24.2766667 0.3146667 578.30000 -1.11 6
这不是完成这项工作的最巧妙方法,但是一个解决方案:
使用formula
和 paste0
:
sincos.update <- update(mod, formula(paste0('.~. + I(cos(2*pi/',k,'*(order.ID))) + I(sin(2*pi/',k,'*(order.ID)))')))
有一种更简洁(或至少更普遍适用)的方法:使用 substitute()
sincos.update <- update(mod3, substitute(.~. + I(cos(2*pi/i*(Plot))) + I(sin(2*pi/i*(Plot))),list(i = as.numeric(k))))
或者,在问题的上下文中:
sincos.chooser <- function(mod,min,max) {
my.aic.sincos <- matrix(NA, ncol=2, nrow=max)
for(k in c(min:max)) {
sincos.update <- update(mod3,
substitute(
.~. + I(cos(2*pi/i*(Plot))) + I(sin(2*pi/i*(Plot))),
list(i = as.numeric(k))
)
)
my.aic.sincos[k,] <- c(k,AIC(sincos.update))
}
my.aic.sincos
}
当您尝试将变量(作为来自 data.frame 的列名)递归添加到模型[=22]时,此方法也效果很好=]:
#Set-up Data
dat <- data.frame(Id = rep(1:5,3), X = runif(15), Y = runif(15), Var1 = runif(15), Var2 = runif(15))
varnames <- names(dat)
#Use substitute() in function:
lapply(varnames[grep('Var',varnames)], function(x)
lm( substitute(Y ~ X + i, list(i = as.name(x))), data = dat)
)
我有以下功能:
sincos.chooser <- function(mod,min,max) {
my.aic.sincos <- matrix(NA, ncol=2, nrow=max)
for(k in c(min:max)) {
sincos.update <- update(mod, .~. + I(cos(2*pi/k*(order.ID))) + I(sin(2*pi/k*(order.ID))))
my.aic.sincos[k,] <- c(k,AIC(sincos.update))
}
my.aic.sincos
}
但是当我 运行 函数时,我得到以下错误:
Error in get("k") : object 'k' not found
如何在循环的更新函数中识别变化的变量 k?
我假设这里的问题是更新函数假定 "k" 是我的 data.frame 中的列名,因此找不到该对象。我希望它将 "k" 视为变量,而不是参数名称。
更新:我尝试使用 get('k')
代替 "k." 如果我将 update
函数移到我的 "sincos.chooser" 函数,但是在 in 我的函数中使用时会产生与上面相同的错误。
对于那些想要查看我的数据和模型的人:
原型号:
gls(GDD ~ year + pdo, data = dat)
我的数据格式:
> dat
year month temp.avg ppt.avg GDD pdo order.ID
1 1922 1 0.4935484 0.3535484 14.40737 -0.45 1
2 1923 2 4.3892857 0.4542857 56.03017 -1.51 2
3 1924 3 7.3032258 0.5435484 106.49244 -1.76 3
4 1925 4 12.8533333 0.2583333 239.07739 -1.71 4
5 1926 5 19.7903226 0.4667742 458.50000 -1.61 5
6 1927 6 24.2766667 0.3146667 578.30000 -1.11 6
这不是完成这项工作的最巧妙方法,但是一个解决方案:
使用formula
和 paste0
:
sincos.update <- update(mod, formula(paste0('.~. + I(cos(2*pi/',k,'*(order.ID))) + I(sin(2*pi/',k,'*(order.ID)))')))
有一种更简洁(或至少更普遍适用)的方法:使用 substitute()
sincos.update <- update(mod3, substitute(.~. + I(cos(2*pi/i*(Plot))) + I(sin(2*pi/i*(Plot))),list(i = as.numeric(k))))
或者,在问题的上下文中:
sincos.chooser <- function(mod,min,max) {
my.aic.sincos <- matrix(NA, ncol=2, nrow=max)
for(k in c(min:max)) {
sincos.update <- update(mod3,
substitute(
.~. + I(cos(2*pi/i*(Plot))) + I(sin(2*pi/i*(Plot))),
list(i = as.numeric(k))
)
)
my.aic.sincos[k,] <- c(k,AIC(sincos.update))
}
my.aic.sincos
}
当您尝试将变量(作为来自 data.frame 的列名)递归添加到模型[=22]时,此方法也效果很好=]:
#Set-up Data
dat <- data.frame(Id = rep(1:5,3), X = runif(15), Y = runif(15), Var1 = runif(15), Var2 = runif(15))
varnames <- names(dat)
#Use substitute() in function:
lapply(varnames[grep('Var',varnames)], function(x)
lm( substitute(Y ~ X + i, list(i = as.name(x))), data = dat)
)