非线性混合模型:我做错了什么?

Nonlinear mixed models: what am I doing wrong?

我正在处理一个由三列组成的数据集: 患者 ID (ID)、TIME 和宫颈扩张 (CD)。对于无法共享我的数据,我提前表示歉意,因为它是机密的,但我在下面包含了一个示例 table。随着分娩的进展,及时记录每个患者的 CD。时间以小时计算,CD 可以是 1-10cm。时间points/CD的次数因患者而异。在此模型中,t 设置为反向,其中 10 cm(完全扩张)设置为所有患者的 t=0。这样做是为了让所有患者都能在完全扩张时对齐。我的数据集没有 NA,所有患者都有 2 个或更多时间点。

ID TIME CD
1 0 10
1 3 8
1 6 5
2 0 10
2 1 9
2 4 7
2 9 4

我知道这个问题需要使用非线性混合效应模型。我从文献中知道,定义此生物过程的函数最好建模为 CD= Cexp(-At)+(10-C)[=38 形式的双指数函数=]exp(-Lt),其中A为活跃产程[cm/hour],L为潜产率[cm/hour],C为宫颈直径[cm] 在患者从潜伏期转为活跃期的时间点,t 是以小时为单位的时间。

我已经尝试使用 nlmer() 和 nlme() 来拟合这些数据,并且我已经使用了自启动双指数函数 SSbiexp() 以及创建了我自己的函数及其 deriv()。每个参数 C、A 和 L 都应具有基于 ID 的随机效果。以前的工作表明 C~4.98cm,A~0.41cm/hr,L~0.07cm/hr。使用 SSbiexp() 时,有一个术语表示第二个指数分量,此处标记为 C2,但应与我自制的双指数函数的 (10-C) 分量相同。

将 nlme() 与 SSbiexp() 一起使用时,我收到错误消息: 第 0 级的反向求解中的奇异性,块 1

nlme_ssbiexp<- nlme(CD~SSbiexp(TIME, C, A, C2, L),
                  data= df,
                  fixed = C+A+C2+L ~1, 
                  random= C+A+C2+L ~1|ID, 
                  start= c(C=4.98, A=0.41, C2= 5.02, L=0.07))

将 nlme() 与我自制的 biexp 函数一起使用时,我收到错误消息: 未收敛达到最大迭代次数(maxIter = 50)

start<- c(C=4.98, A=0.41, L=0.07)
biexp<- ~ C*exp(-A*t) + (10-C)*exp(-L*t)
nfun <- deriv(biexp, namevec=c("C", "A", "L"),
              function.arg=c("t","C", "A", "L"))
nlme_my_biexp<- nlme(CD~nfun(TIME, C, A, L),
                  data= df,
                  fixed = C+A+L ~1, 
                  random= C+A+L ~1|ID, 
                  start= c(C=4.98, A=0.41, L= 0.07))

将 nlmer() 与 SSbiexp() 结合使用时,我收到错误消息: devfun(rho$pp$theta) 中的错误:过时的 VtV 不是正定的

nlmer_ssbiexp<-nlmer(CD~SSbiexp(TIME, C, A, C2, L)~(C|PTID)+(A|PTID)+(C2|PTID)+(L|PTID),
                   data=df,
                   start= c(T1= 4.98, R1=0.41, T2=5.02, R2=0.07))

将 nlmer() 与我自制的 biexp 函数一起使用时,我收到错误消息: devfun(rho$pp$theta) 错误:prss{Update} 在 'maxit' 次迭代中无法收敛

  start<- c(C=4.98, A=0.41, L=0.07)
  biexp<- ~ C*exp(-A*t) + (10-C)*exp(-L*t)
  nfun <- deriv(biexp, namevec=c("C", "A", "L"),
                function.arg=c("t","C", "A", "L"))
  nlmer.fit.fun <- nlmer(CD ~ nfun(TIME, C, A, L) ~ (C|ID)+(A|ID)+(L|ID),
                          data = df,
                          start = start)

我使用 nlmer() 和我自制的 biexp 函数的最后组合取得了一些成功,但只有当我将我的随机效应减少到仅包括 (C|ID) 时才会如此。

start<- c(C=4.98, A=0.41, L=0.07)
  biexp<- ~ C*exp(-A*t) + (10-C)*exp(-L*t)
  nfun <- deriv(biexp, namevec=c("C", "A", "L"),
                function.arg=c("t","C", "A", "L"))
  nlmer.fit.fun <- nlmer(CD ~ nfun(TIME, C, A, L) ~ (C|ID),
                          data = df,
                          start = start)

我已经尝试增加 maxit 和 MaxIter,但两者仍然无法收敛。我一直无法在 Stack Overflow 上找到任何有助于解决这些问题的解决方案,尽管我已经在多个线程中看到过它们的讨论。我也试过翻转时间尺度,使 t=0 并不总是与 CD=10 相关联,但这并没有改变我的问题。我是 R 的新手,所以我希望 nlmer() 或 nlme() 方面的专家可能知道这些错误消息的修复方法。

Ben Bolker- 如果您正在阅读本文-我真的很想和您谈谈!

这是我的进展情况:

  • 指数率应该指定为 logs 率(以确保率本身保持正数,即我们有指数 衰减 曲线而不是增长曲线)
  • 我大大简化了模型,去掉了 T1T2 中的随机效应。
nlmer.ssbiexp<- nlmer(CD~SSbiexp(TIME, T1, R1, T2, R2)~
                        (R1|ID) + (R2|ID),
                      data=df,
                      start= c(T1= 4.98, R1=log(0.41), T2=5.25, R2=log(0.07)))

此时我会尝试:

  • T2 指定为 10-T1 以简化模型(不确定这是否真的有效)
  • 看看您是否可以重新构建实际有效的模型的更复杂版本