在R上的似然方程上使用optim函数时出错

时间:2014-08-04 18:24:28

标签: r optimization types coerce

我是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函数: optim中的错误(par = estimate,fn = log.lik,control = list(fnscale = -1),:   不能强迫类型'关闭'到' double'

类型的向量

有人会知道这里可能出现什么问题吗?任何帮助将不胜感激!

数据文件只是csv格式的一列模拟财务损失。当我在这里输出datafile变量时,我得到了一个样本:

       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

包含评论更改的已编辑代码:

 > 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)

1 个答案:

答案 0 :(得分:1)

评论太长了。

首先,您仍然错误地使用integrate(...)。此函数返回一个列表(阅读文档!! )。此列表的$value元素是不可或缺的。为了找到fab的积分,请使用:

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

可悲的是,这是你遇到的最少的问题。从根本上说,你采取了太多的捷径。你不能把一些代码放在一起 - 你需要注意数学

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

为了记录,我没有对你的问题进行投票(因为我觉得这种做法令人反感......)但是你真的需要努力理解你的对数似然函数是否正确,以及何时#&# 39;已经这样做了,仔细看看你的初步估计。