我是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)
答案 0 :(得分:1)
评论太长了。
首先,您仍然错误地使用integrate(...)
。此函数返回一个列表(阅读文档!! )。此列表的$value
元素是不可或缺的。为了找到f
从a
到b
的积分,请使用:
integrate(f,a,b,...)$value
可悲的是,这是你遇到的最少的问题。从根本上说,你采取了太多的捷径。你不能把一些代码放在一起 - 你需要注意数学。
例如,您是否将integrand(...)
函数的值绘制为theta
的初始值,范围为(mu,Inf)
??如果你有,你会看到被积函数在这个范围内是0,因为mu=1500
和b=1
和exp(-1500/1)
在数字上为0;因此积分为0,积分的对数未定义。此外,您的目标函数包括术语log(-beta*(x-tau))
,但对于数据集中所有beta=tau=1
的{{1}},-beta*(x-tau) < 0
,并且日志未定义。
为了记录,我没有对你的问题进行投票(因为我觉得这种做法令人反感......)但是你真的需要努力理解你的对数似然函数是否正确,以及何时#&# 39;已经这样做了,仔细看看你的初步估计。