r - 如何在 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 带有一些附加消息。
哪种方法适合从上述纵向和二元正态分布问题估计参数?
解决方案
L-BFGS-B
认为一切都很好(收敛代码=0);您在此处看到的“gradient=15”仅表示评估梯度的次数。消息(“CONVERGENCE: REL_REDUCTION_OF_F ...”)为您提供了有关如何达到收敛的额外信息(L-BFGS-B 使用多个标准),但您无需担心。
使用默认 (Nelder-Mead) 优化器,optim()
报告“Nelder-Mead 单纯形的退化”(参见 参考资料?optim
),即optim()
用于搜索最优值的参数空间区域已折叠到较低维度。不要用这个。
与往常一样,您应该评估您的结果,以确保它们在您的问题背景下有意义......
注意:我只回答这里提出的狭窄问题。我实际上并没有检查你的代码,看看它是否合理。
推荐阅读
- angular - “您似乎不依赖于“@angular/core”和/或“rxjs”。这是一个错误。“将 MEAN-app 部署到 Heroku 时
- pointers - 重新分配指针
- python-3.x - 如何在给定的 .csv 文件中使用 python3 + Pandas 仅用一个选项卡替换多个选项卡
- javascript - 如何让我的机器人每 10 秒更改一次状态?
- python - Python-实时传感器数据绘图
- deep-learning - 从驱动器中为 Google Colab 获取文件夹
- c# - Visual Studio 2019 中默认的 ASP.NET Core + React 模板不起作用
- python - KivyMD 通过屏幕共享变量/数据
- python - 如何访问每个小部件的轴
- macos - 实施“。” x86 汇编中来自 Forth 的单词