(R) optim中出错-定义函数时,尝试应用非函数

(R) optim中出错-定义函数时,尝试应用非函数,r,syntax-error,cross-validation,R,Syntax Error,Cross Validation,不知道我做错了什么。我试图得到两个gammas模型混合的交叉验证分数 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

不知道我做错了什么。我试图得到两个gammas模型混合的交叉验证分数

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)
llikGammaMix2=函数(参数,x){
如果(任何(参数<0)| |参数[“p1”]>1){
返回(-Inf)
}否则{
返回(总和(对数)(
dgamma(x,形状=参数[“k1”],比例=参数[“θ1”])*
参数[“p1”]+dgamma(x,形状=参数[“k2”],比例=参数[“θ2”])*
1.
(1-参数[“p1”])
)))
}
}
initialParams=列表(
θ1=1,
k1=1.1,
p1=0.5,
θ2=10,
k2=2
)
适用于(i in 1:nrow(cichlids)){

SWS1_training我相信问题出在return语句中。不清楚您是想将最后一个数量(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?

代码可能还有其他问题。我会仔细检查您正在优化的函数是否符合您的要求。除非您给出一个我们可能能够使用的可复制示例,否则也很难说。请尝试澄清上述问题,并让我们知道是否还有问题。

您能给出一个
cichlid的示例吗s
?我正在尝试运行代码,如果没有该对象,我无法复制此问题。它是一个数据帧,94行(观察值)乘以13列(变量)
SWS1是一个数字变量。