(R) optim中出错-定义函数时,尝试应用非函数
不知道我做错了什么。我试图得到两个gammas模型混合的交叉验证分数(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
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是一个数字变量。