将更改的for-loop变量插入模型公式

时间:2016-03-18 15:39:16

标签: r function loops variables runtime-error

我有以下功能:

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

我认为这里的问题是更新功能假设&#34; k&#34;是我的data.frame中的列名,因此无法找到该对象。我希望它能够查看&#34; k&#34;作为变量,而不是参数名称。

更新:我尝试使用get('k')代替&#34; k。&#34;如果我将update函数移到我的&#34; sincos.chooser&#34;之外,这是有效的。函数,但在使用 inside 我的函数时会产生与上面相同的错误。

对于那些想要查看我的数据的人模型:

原型:

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

2 个答案:

答案 0 :(得分:0)

这不是最有效的方法,但的解决方案:

使用formula paste0

sincos.update <- update(mod, formula(paste0('.~. + I(cos(2*pi/',k,'*(order.ID))) + I(sin(2*pi/',k,'*(order.ID)))')))

答案 1 :(得分:0)

有一种更简洁(或至少更普遍适用)的方式:使用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中的列名称)到模型时,此方法也很有效:

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