为什么 SAS nlmixed 和 R nlme 给出不同的模型拟合结果?

机器算法验证 r 混合模式 sas
2022-03-04 16:56:25
library(datasets)
library(nlme)
n1 <- nlme(circumference ~ phi1 / (1 + exp(-(age - phi2)/phi3)),
           data = Orange,
           fixed = list(phi1 ~ 1,
                        phi2 ~ 1,
                        phi3 ~ 1),
           random = list(Tree = pdDiag(phi1 ~ 1)),
           start = list(fixed = c(phi1 = 192.6873, phi2 = 728.7547, phi3 = 353.5323)))

我在 R 中拟合了一个非线性混合效应模型nlme,这是我的输出。

> summary(n1)
Nonlinear mixed-effects model fit by maximum likelihood
  Model: circumference ~ phi1/(1 + exp(-(age - phi2)/phi3)) 
 Data: Orange 
       AIC      BIC    logLik
  273.1691 280.9459 -131.5846

Random effects:
 Formula: phi1 ~ 1 | Tree
            phi1 Residual
StdDev: 31.48255 7.846255

Fixed effects: list(phi1 ~ 1, phi2 ~ 1, phi3 ~ 1) 
        Value Std.Error DF  t-value p-value
phi1 191.0499  16.15411 28 11.82671       0
phi2 722.5590  35.15195 28 20.55530       0
phi3 344.1681  27.14801 28 12.67747       0
 Correlation: 
     phi1  phi2 
phi2 0.375      
phi3 0.354 0.755

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-1.9146426 -0.5352753  0.1436291  0.7308603  1.6614518 

Number of Observations: 35
Number of Groups: 5 

我在 SAS 中拟合相同的模型并得到以下结果。

    data Orange;
    input row Tree  age circumference;
    datalines;
1     1  118            30
2     1  484            58
3     1  664            87
4     1 1004           115
5     1 1231           120
6     1 1372           142
7     1 1582           145
8     2  118            33
9     2  484            69
10    2  664           111
11    2 1004           156
12    2 1231           172
13    2 1372           203
14    2 1582           203
15    3  118            30
16    3  484            51
17    3  664            75
18    3 1004           108
19    3 1231           115
20    3 1372           139
21    3 1582           140
22    4  118            32
23    4  484            62
24    4  664           112
25    4 1004           167
26    4 1231           179
27    4 1372           209
28    4 1582           214
29    5  118            30
30    5  484            49
31    5  664            81
32    5 1004           125
33    5 1231           142
34    5 1372           174
35    5 1582           177
;


proc nlmixed data=Orange;
parms phi1=192.6873 phi2=728.7547 phi3=353.5323 vb1=991.151, s2e=61.56372;
mod = (phi1 + u1)/(1 + exp(-(age - phi2)/phi3));
model circumference ~ normal(mod, s2e);
random u1 ~ normal([0],[vb1]) subject=Tree;
run;

在此处输入图像描述

有人可以帮我理解为什么我得到的估计略有不同吗?我知道nlme使用 Lindstrom & Bates (1990) 实现。根据 SAS 文档,SAS 的积分近似值基于 Pinhiero & Bates (1995)。我尝试将优化方法更改为 Nelder-Mead 以匹配nlme,但结果仍然不同。

我遇到过其他情况,其中 R 与 SAS 中的标准误差和参数估计有很大不同(我没有可重复的例子,但任何见解都会受到赞赏)。我猜这与在存在随机效应的情况下如何nlme估计nlmixed标准误差有关?

2个回答

FWIW,我可以使用手动优化重现 sas 输出

########## data ################

circ <- Orange$circumference
age <- Orange$age
group <- as.numeric(Orange$Tree)
#phi1 = n1[4]$coefficients$random$Tree + 192
phi1 = 192
phi2 = 728
phi3 = 353

######### likelihood function

Likelihood <- function(x,p_age,p_circ) {
  phi1 <- x[1]
  phi2 <- x[2]
  phi3 <- x[3]
  
  fitted <- phi1/(1 + exp(-(p_age - phi2)/phi3))
  fact <- 1/(1 + exp(-(p_age - phi2)/phi3))
  resid <- p_circ-fitted
  
  sigma1 <- x[4]  #  phi1 term
  sigma2 <- x[5]  #  error term
  
  covm <- matrix(rep(0,35*35),35)  # co-variance matrix for residual terms 

  #the residuals of the group variables will be correlated in 5 7x7 blocks      
  for (k in 0:4) {
    for (l in 1:7) {
      for (m in 1:7) {
        i = l+7*k
        j = m+7*k
        if (i==j) {
          covm[i,j] <- fact[i]*fact[j]*sigma1^2+sigma2^2
        }
        else {
          covm[i,j] <- fact[i]*fact[j]*sigma1^2
        }
      }
    }
  }
  
  logd <- (-0.5 * t(resid) %*% solve(covm) %*% resid) - log(sqrt((2*pi)^35*det(covm)))
  logd
}


##### optimize

out <- nlm(function(p) -Likelihood(p,age,circ),
           c(phi1,phi2,phi3,20,8),
           print.level=1,
           iterlim=100,gradtol=10^-26,steptol=10^-20,ndigit=30) 

输出

iteration = 0
Step:
[1] 0 0 0 0 0
Parameter:
[1] 192.0 728.0 353.0  30.0   5.5
Function Value
[1] 136.5306
Gradient:
[1] -0.003006727 -0.019069001  0.034154033 -0.021112696
[5] -5.669238697

iteration = 52
Parameter:
[1] 192.053145 727.906304 348.073030  31.646302   7.843012
Function Value
[1] 131.5719
Gradient:
[1] 0.000000e+00 5.240643e-09 0.000000e+00 0.000000e+00
[5] 0.000000e+00

Successive iterates within tolerance.
Current iterate is probably solution.
  • 所以 nlmixed 输出接近这个最优值,它不是一个不同的收敛事物。

  • nlme 输出也接近(不同的)最优值。(您可以通过更改函数调用中的优化参数来检查这一点)

  • 我不知道 nlme 是如何计算可能性的。好像和上面手动优化的一样。当我们从 nlme 输出中填充值时,我们得到相同的对数似然值 -131.5846。

    > Likelihood(c(191.0499,722.5590,344.1621,31.48255,7.846255),age,circ)
             [,1]
    [1,] -131.5846
    

    手册_参考 Lindstrom, MJ 和 Bates, DM 在 Biometrics 第 46 卷第 673-687 页上的一篇文章。在那篇文章中描述了一种近似观察值的边际分布的方法(在您的情况下为周长)。边际分布是对未观察到的随机效应值的所有可能值进行积分。这种整合是必要的,因为与线性模型不同,非线性模型不能简单地线性添加随机效应。结果是残差的最终表达式可能不同。在上面的代码中,我们将周长减去拟合值,但在本文中,它们还减去了一个由线性近似产生的与随机效应相关的项。该方法还将这些随机效应估计为算法的一部分。

我处理过同样的问题并同意 Martjin 的观点,即您需要调整 R 中的收敛标准以使其与 SAS 匹配。更具体地说,您可以尝试这种我发现在我的情况下工作得很好的参数规范组合(在 lCtr 对象中)。

lCtr <- lmeControl(maxIter = 200, msMaxIter=200, opt='nlminb', tolerance = 1e-6, optimMethod = "L-BFGS-B")

n1 <- nlme(circumference ~ phi1 / (1 + exp(-(age - phi2)/phi3)),
           data = Orange,
           fixed = list(phi1 ~ 1,
                        phi2 ~ 1,
                        phi3 ~ 1),
           random = list(Tree = pdDiag(phi1 ~ 1)),
           start = list(fixed = c(phi1 = 192.6873, phi2 = 728.7547, phi3 = 353.5323)),
           control = lCtr)

公平警告:这应该让您在 SAS 和 R 之间获得相同的固定估计值。但是,您可能不会获得相同的固定效应 SE(我仍在研究答案......)。