我是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
元素是积分。所以求f
从a
到b
的积分,用:
integrate(f,a,b,...)$value
遗憾的是,这只是你最小的问题。从根本上说,你走了太多捷径。你不能只是把一些代码拼凑在一起——你需要注意数学。
例如,您是否绘制了theta
初始值的integrand(...)
函数值,在(mu,Inf)
范围内??如果你有,你会发现被积函数在这个范围内是0,因为mu=1500
和b=1
,以及exp(-1500/1)
都是数值0;因此积分是0,积分的对数没有定义。此外,您的目标函数包括术语log(-beta*(x-tau))
,但对于beta=tau=1
, -beta*(x-tau) < 0
用于您数据集中的所有x
,并且再次未定义日志。
郑重声明,我没有否决你的问题(因为我觉得这种做法令人反感……),但你确实需要努力理解你的对数似然函数是否正确,当你做到这一点时,仔细看看你最初的估计。