r - (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
。
我的第一个想法是某个地方出现了一个愚蠢的拼写错误,但似乎并非如此。任何帮助表示赞赏。
解决方案
我相信问题出在退货声明中。目前尚不清楚您是否打算将最后一个数量乘以或添加(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?
代码可能还有其他问题。我会仔细检查您正在优化的功能是否是您认为应该的。除非你给出一个我们可以使用的可重复的例子,否则这也很难说。尝试清除上述问题并让我们知道是否仍有问题。
推荐阅读
- pascal - 如何对大括号和开/关括号进行排序?
- python - discord.py 中的错误处理程序出错,即使给出的所有内容都是必需的,也给出了太多的位置参数
- python - 寻找最不完美二乘的 BFS 解决方案
- postman - 如何忽略 Newman 中的 SSL 证书错误
- node.js - NodeJS 和 ExpressJS 如何抛出错误?
- php - 获取自定义帖子类型的 wordpress 类别
- php - 未经用户授权从 API 访问 GSuite 用户日历
- node.js - Lambda 函数适用于 AWS 控制台,但不适用于 Cloud9
- talend - 将 ETL 作业从免费的 Talend Open Studio 迁移到 Talend Server 的最佳方式?
- php - JSON:使用 php 从数组中获取特定行