首页 > 解决方案 > (R) 优化错误 - 在定义函数时尝试应用非函数

问题描述

不知道我在这里做错了什么。我正在尝试获得混合两个伽马模型的交叉验证分数。

llikGammaMix2 = function(param, x) {
  if (any(param < 0) || param["p1"] > 1) {
    return(-Inf)
  } else {
    return(sum(log(
      dgamma(x, shape = param["k1"], scale = param["theta1"]) *
        param["p1"] + dgamma(x, shape = param["k2"], scale = param["theta2"]) *
        1
      (1 - param["p1"])
    )))
  }
}

initialParams = list(
  theta1 = 1,
  k1 = 1.1,
  p1 = 0.5,
  theta2 = 10,
  k2 = 2
)

for (i in 1:nrow(cichlids)) {
  SWS1_training <- cichlids$SWS1 - cichlids$SWS1[i]
  SWS1_test <- cichlids$SWS1[i]
  MLE_training2 <-
    optim(
      par = initialParams,
      fn = llikGammaMix2,
      x = SWS1_training,
      control = list(fnscale = -1)
    )$par
  LL_test2 <-
    optim(
      par = MLE_training2,
      fn = llikGammaMix2,
      x = SWS1_test,
      control = list(fnscale = -1)
    )$value
}
print(LL_test2)

这一直运行到第一个optim(),然后吐出Error in fn(par, ...) : attempt to apply non-function

我的第一个想法是某个地方出现了一个愚蠢的拼写错误,但似乎并非如此。任何帮助表示赞赏。

标签: rsyntax-errorcross-validation

解决方案


我相信问题出在退货声明中。目前尚不清楚您是否打算将最后一个数量乘以或添加(1 - param["p1"]))))到返回值。基于是一种混合物,我猜你的意思是让它成倍增加。相反,它只是挂在最后,这会给函数带来问题:

    return(sum(log(dgamma(x, shape = param["k1"], scale = param["theta1"]) *
                     param["p1"] + 
                   dgamma(x, shape = param["k2"], scale = param["theta2"]) *
                     (1 - param["p1"])))) ## ISSUE HERE: Is this what you meant?

代码可能还有其他问题。我会仔细检查您正在优化的功能是否是您认为应该的。除非你给出一个我们可以使用的可重复的例子,否则这也很难说。尝试清除上述问题并让我们知道是否仍有问题。


推荐阅读