首页 > 解决方案 > 如何在 R 中使用 OPTIM 解决纵向数据(和随机效应)的问题($convergence=10 和 $gradient=15)?

问题描述

我试图从纵向数据 (y) 中估计参数,其中随机效应被用作 y 平均值的一部分。随机效应遵循双变量正态分布。在 r 中使用 optim 时,不同的方法会提供不同的结果。

library(JM)
library(MASS)
library(survival)
library(splines)
library(nlme)
library(mvtnorm)

数据:

data("aids")
aids<-na.omit(aids)
aids<-aids[order(aids$Time),]
aids=aids[aids$patient %in% c(1:11), c("patient", "CD4",
  "obstime","Time","death","drug")]
delta<-aids$death
tv<-aids$Time
Zmat<-cbind(rep(1,length(delta)),aids$obstime)
aids$trt=as.numeric(aids$drug=="ddI")
Xmat<-cbind(rep(1,length(delta)),aids$obstime, aids$trt*aids$obstime)
Wmat=cbind(aids$trt)
y=aids$CD4
n=length(delta)
k=length(unique(aids$patient))

创建函数以在 optim 中使用

p_y_hat=function(par,y,Xmat,Zmat){
  v.beta=par[1:3]
  v.sigma=par[4]
  mu=c(0,0)
  v.s=matrix(c(par[5],par[6],par[6],par[7]),2,2)
  b=mvrnorm(k,mu,v.s)
  m=drop(Xmat %*% v.beta + rowSums(Zmat * b[aids$patient, ]))
  return(dnorm(y,m,v.sigma))
}

m.LL1<-function(par,y,Xmat,Zmat) {
  LL1.pr<-p_y_hat(par,y,Xmat,Zmat)
  return( - sum(log(LL1.pr) ))
}

默认优化方法

fit1<-optim(par=c(1,0.2,0.2,5,2,1,3),m.LL1,
            control=list(maxit=1000),y=y,Xmat=Xmat,Zmat=Zmat)

它提供

> fit1

$par  
[1] 1.2277439 0.2643519 0.2702051 5.2276476 1.9062541 0.9728032 2.8033234    
$value    
[1] 102.8805    
$counts    
function gradient     
     853       NA     
$convergence
[1] 10
$message
NULL

L-BFGS-B 方法

    fit1<-optim(par=c(1,0.2,0.2,5,2,1,3),m.LL1,
  method="L-BFGS-B",control=list(maxit=1000),y=y,Xmat=Xmat,Zmat=Zmat)

$par
[1] 1.07742647 0.47206512 0.04462127 5.09672419 2.03116102 1.15173075 3.06604291
$value
[1] 305.7507
$counts
function gradient 
      15       15 
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

我对正确的方法有点困惑。第一个给出了 $convergence=10 (这应该是错误的),第二个给出了 $convergence=0 但 $gradient=15 带有一些附加消息。

哪种方法适合从上述纵向和二元正态分布问题估计参数?

标签: r

解决方案


L-BFGS-B认为一切都很好(收敛代码=0);您在此处看到的“gradient=15”仅表示评估梯度的次数。消息(“CONVERGENCE: REL_REDUCTION_OF_F ...”)为您提供了有关如何达到收敛的额外信息(L-BFGS-B 使用多个标准),但您无需担心。

使用默认 (Nelder-Mead) 优化器,optim()报告“Nelder-Mead 单纯形的退化”(参见 参考资料?optim),即optim()用于搜索最优值的参数空间区域已折叠到较低维度。不要用这个。

与往常一样,您应该评估您的结果,以确保它们在您的问题背景下有意义......

注意:我只回答这里提出的狭窄问题。我实际上并没有检查你的代码,看看它是否合理。


推荐阅读