【发布时间】:2014-08-04 18:24:27
【问题描述】:
我是 R 的初学者,在尝试使用 optim 函数时遇到了错误。
我想最大化一个似然方程,所以我实现了以下代码:
>datafile=read.delim("clipboard")
> log.lik=function(theta, x, mu){
+ b=theta[1]
+ beta=theta[2]
+ tau=theta[3]
+ result=function(b,beta, tau){(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(exp(-x/b)/(1+exp(-beta(x-tau)))), lower=1500, upper=Inf))}
+ return(result)
+ }
> estimate=c(1,1,1)
> model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)
一切正常,直到我收到以下错误消息的 optim 函数: 优化错误(par = 估计,fn = log.lik,控制 = 列表(fnscale = -1),: 无法将类型“闭包”强制为“双”类型的向量
有人知道这里可能存在什么问题吗?任何帮助将不胜感激!
数据文件只是 csv 格式的一列模拟财务损失。当我输出数据文件变量时,这是我得到的示例:
X1946774
1 34949037
2 734018898
3 393502463
4 388573133
5 93213300
6 74982868
7 55322550
8 10828207
9 4530577
10 3786748
11 2041762
12 342745985
13 292313639
14 259569928
15 143871771
16 53691635
17 24489644
18 20506718
19 14281945
编辑的代码合并了来自 cmets 的更改:
> log.lik=function(theta,x,mu){
+ b=theta[1]
+ beta=theta[2]
+ tau=theta[3]
+ integrand<-function(x,b,beta,tau){exp(-x/b)/(1+exp(-beta*(x-tau)))}
+ result<-(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(integrand, lower=mu, upper=Inf)))
+ return(result)
+ }
> model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)
【问题讨论】:
-
如果您生成 minimal, reproducible example 会有所帮助,这样我们就可以将代码复制并粘贴到 R 中并得到相同的错误。这样调试起来要容易得多。我们真的不知道您的
datafile变量中有什么。 -
您的函数
log.lik(...)正在返回一个函数,而不是一个值。尝试将result=function(b,beta,tau){...}行替换为result <- ...,其中...是括号之间的表达式。 -
另外,您错误地使用了
integrate(...)。它需要一个函数作为第一个参数,而您正在传递一个表达式。 -
@jlhoward,感谢您的回复!我刚刚添加了更改,从而消除了错误,但现在我收到了以下消息: -x/b 中的错误:缺少'b' 另外:警告消息:在 lapply(X = x, FUN = .Generic , ...) : NaNs 生成我将把我更改的代码添加到帖子中,以便您查看
标签: r optimization types coerce