【问题标题】:Error while using optim function on likelihood equation on R在R上的似然方程上使用优化函数时出错
【发布时间】: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 &lt;- ...,其中... 是括号之间的表达式。
  • 另外,您错误地使用了integrate(...)。它需要一个函数作为第一个参数,而您正在传递一个表达式。
  • @jlhoward,感谢您的回复!我刚刚添加了更改,从而消除了错误,但现在我收到了以下消息: -x/b 中的错误:缺少'b' 另外:警告消息:在 lapply(X = x, FUN = .Generic , ...) : NaNs 生成我将把我更改的代码添加到帖子中,以便您查看

标签: r optimization types coerce


【解决方案1】:

评论太长了。

首先,您仍在错误地使用integrate(...)。该函数返回一个列表(阅读文档!!)。此列表的$value 元素是积分。所以要找到fab 的积分,使用:

integrate(f,a,b,...)$value

很遗憾,这是您遇到的最少的问题。从根本上说,你走的捷径太多了。你不能只是把一些代码拼凑在一起——你需要注意数学

例如,您是否针对theta 的初始值绘制了integrand(...) 函数的值,在(mu,Inf) 范围内?如果你有,你会看到被积函数在这个范围内是 0,因为 mu=1500b=1,而 exp(-1500/1) 在数字上是 0;因此积分为 0,积分的对数未定义。此外,您的目标函数包括术语log(-beta*(x-tau)),但对于beta=tau=1-beta*(x-tau) &lt; 0 用于数据集中的所有x,并且再次未定义日志。

为了记录,我没有否决你的问题(因为我觉得这种做法令人反感......),但你确实需要努力了解你的对数似然函数是否正确,以及何时完成那,仔细看看你的初步估计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多