在R中使用optim
我试图使用R中的optim函数来优化模型中的三个参数,但无法找出如何让它搜索一系列值,就像使用optimize函数一样。 我尝试过使用for循环,这是我最成功的尝试,但由于某种原因,它似乎停止在355的值,理想情况下,我想尝试比这个更高的组合。 除此之外,我尝试过多次调用OpTIM的函数,尝试向量化,并尝试将列表值放入OpTIM中的PAR参数中,但是所有这些尝试都产生了错误消息。在R中使用optim,r,R,我试图使用R中的optim函数来优化模型中的三个参数,但无法找出如何让它搜索一系列值,就像使用optimize函数一样。 我尝试过使用for循环,这是我最成功的尝试,但由于某种原因,它似乎停止在355的值,理想情况下,我想尝试比这个更高的组合。 除此之外,我尝试过多次调用OpTIM的函数,尝试向量化,并尝试将列表值放入OpTIM中的PAR参数中,但是所有这些尝试都产生了错误消息。 "unable to evaluate at initial parameters". 长短有谁知道我如何使用op
"unable to evaluate at initial parameters".
长短有谁知道我如何使用optim函数像optimize函数那样搜索一系列参数值吗
任何帮助或指点都将不胜感激
我的代码如下所示:
这是对应比例的三个最大似然函数,然后是使用optim的三次尝试
rm(list=ls())
load('Dat.RData')
mean(dat)
var(dat)
loglike<-function(par,dat,scale)
{ ptp<-dat[1:length(dat)-1]
ptp1<-dat[2:length(dat)]
r<-par['r']
k<-par['k']
sigma<-par['sigma']
if(scale=='log')
{
return(sum(dnorm(log(ptp1)-log(ptp)*exp(r-(ptp/k)),mean=0,sd=sigma,log=T)))
}
if (scale=='sqrt')
{
return(sum(dnorm(sqrt(ptp1)-sqrt(ptp)*exp(r-(ptp/k)),mean=0,sd=sigma,log=T)))
}
if (scale=='linear')
{
return(sum(dnorm(ptp1-ptp*exp(r-(ptp/k)),mean=0,sd=sigma,log=T)))
}
}
sqrts<-c()
for(i in 1:4000){
sqrts[i]<-optim(par=c(r=i,k=i,sigma=i),fn=loglike,dat=dat,scale='sqrt',method='Nelder-Mead',control=list(fnscale=-1))
}
logs<-c()
for(i in 1:4000){
logs[i]<-optim(par=c(r=i,k=i,sigma=i),fn=loglike,dat=dat,scale='log',method='Nelder-Mead',control=list(fnscale=-1))
}
lins<-c()
for(i in 1:4000){
lins[i]<-optim(par=c(r=i,k=i,sigma=i),fn=loglike,dat=dat,scale='linear',method='Nelder-Mead',control=list(fnscale=-1))
}
非常感谢 由于optim无法在某些点上计算函数,因此无法在初始参数处计算该错误。这里有很多。请注意:
您使用sqrt,因此您的数据必须是正的,否则您需要删除负的观察值。dat 0]
日志函数的相同问题,dat 1]
循环在这里发生logptp1 logptp,因为用n-1的向量减去n的向量。我会用c1代替ppt1,ppt1
对于线性函数,它会发散,因为您使用给指数函数赋予一个大的r,例如,请参见exp365。
我认为,R是伟大的,因为你可以很容易地绘制你的数据,看看你的函数会发生什么。例如,我在这里使用线框绘制一个函数的三维曲面
dat <- seq(1,100)
ptp <- head(dat,-1)
ptp1 <- c(tail(dat,-2),1)
g <- expand.grid( k = seq(0.1,2,length.out=100), ## k between [0.1,2]
sigma = seq(0.1,1,length.out=100), ## sigma [0.1,1]
r= c(0.1,0.5,0.8,1)) ## some r points forgrouping
z <- rep(0,nrow(g))
for(i in seq_along(z))
z[i] <- sum(dnorm(log(ptp1)-log(ptp)*exp(g[i,'r']-(ptp/g[i,'k'])),
mean=0,
sd=g[i,'sigma'],
log=T))
g$z <- z
any(is.infinite(g$z)) ## you can test if you have infinite value
FALSE
wireframe(z ~ k * sigma, data = g, groups = r,
scales = list(arrows = FALSE),
drape = TRUE, colorkey = TRUE)
由于optim无法在某些点上计算函数,因此无法在初始参数处计算该错误。此处有许多。请注意:
您使用sqrt,因此您的数据必须是正的,否则您需要删除负的观察值。dat 0]
日志函数的相同问题,dat 1]
循环在这里发生logptp1 logptp,因为用n-1的向量减去n的向量。我会用c1代替ppt1,ppt1
对于线性函数,它会发散,因为您使用给指数函数赋予一个大的r,例如,请参见exp365。
我认为,R是伟大的,因为你可以很容易地绘制你的数据,看看你的函数会发生什么。例如,我在这里使用线框绘制一个函数的三维曲面
dat <- seq(1,100)
ptp <- head(dat,-1)
ptp1 <- c(tail(dat,-2),1)
g <- expand.grid( k = seq(0.1,2,length.out=100), ## k between [0.1,2]
sigma = seq(0.1,1,length.out=100), ## sigma [0.1,1]
r= c(0.1,0.5,0.8,1)) ## some r points forgrouping
z <- rep(0,nrow(g))
for(i in seq_along(z))
z[i] <- sum(dnorm(log(ptp1)-log(ptp)*exp(g[i,'r']-(ptp/g[i,'k'])),
mean=0,
sd=g[i,'sigma'],
log=T))
g$z <- z
any(is.infinite(g$z)) ## you can test if you have infinite value
FALSE
wireframe(z ~ k * sigma, data = g, groups = r,
scales = list(arrows = FALSE),
drape = TRUE, colorkey = TRUE)
发布一些你的数据?这会有帮助的。试着发布headdputdat的输出,它将帮助这里的人重建您的部分数据,以便他们可以更轻松地运行代码发布您的部分数据?这会有帮助的。试着发布headdputdat的输出,它将帮助这里的人重建部分数据,以便他们可以更轻松地运行代码我的数据没有负值我的数据没有负值