对R的似然方程使用优化函数时出现错误



我是R的初学者,在尝试使用优化函数时遇到了错误。

我有一个可能性方程,我想最大化,所以我已经实现了以下代码:

>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 = estimate, fn = log)。如,control = list(fnscale = -1),:不能将'闭包'类型强制转换为'double'类型的vector

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

数据文件只是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)

注释太长

首先,您仍然错误地使用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) < 0用于您数据集中的所有x,并且再次未定义日志。

郑重声明,我没有否决你的问题(因为我觉得这种做法令人反感……),但你确实需要努力理解你的对数似然函数是否正确,当你做到这一点时,仔细看看你最初的估计。

最新更新