Sas 在PROC MIXED与lmer中保持随机效应方差常数

Sas 在PROC MIXED与lmer中保持随机效应方差常数,sas,lme4,mixed-models,Sas,Lme4,Mixed Models,我想知道是否可以在Rlme或lmer函数中保持随机效应方差恒定(或R中的另一个随机效应例程),或至少提供起始值 在SAS中,使用PROC MIXED中的parms语句似乎可以实现这一点。在作者的一篇论文中,使用该方法将固定效应结构较简单的模型的方差参数设置为完整模型的方差参数 他们使用的PROC MIXED中的具体调用是parms/parmsdata=fullmodel.AB hold=…他们的目标是在具有不同固定效应结构的模型中保持方差估计不变(尽管我想知道这在SAS或R中是否真的可能)。在g

我想知道是否可以在
R
lme
lmer
函数中保持随机效应方差恒定(或
R
中的另一个随机效应例程),或至少提供起始值

在SAS中,使用
PROC MIXED
中的parms语句似乎可以实现这一点。在作者的一篇论文中,使用该方法将固定效应结构较简单的模型的方差参数设置为完整模型的方差参数


他们使用的PROC MIXED中的具体调用是
parms/parmsdata=fullmodel.AB hold=…
他们的目标是在具有不同固定效应结构的模型中保持方差估计不变(尽管我想知道这在SAS或R中是否真的可能)。

在github上尝试
gnlrim
。它可以在参数有界的情况下进行最大似然估计。只需将随机截距方差的起始值、下限和上限设置为相同的值
pmix
,它将保持不变

下面的示例显示了
gnlrim
使用
REML=FALSE
估计与
lmer
相同的模型。第一块是为了便于复制和粘贴;随后的块显示相关行的执行

设置包、数据和拟合模型(复制和粘贴块):

采用相同的模型,但运行设置并保持随机效果方差常量(复制和粘贴块):

执行用于保持恒定方差的行:
##采用相同的模型,但保持不变
>##随机效应标准差
>##sigma_id:=9
>##sigma^2_id:=81
>gnlrim_fit2
>gnlrim_fit2$coeff
[1]  9.1349920  0.2012785  3.4258404 81.0000000
>gnlrim_fit2$se
[1] 6.1006729 0.4420228 0.3485940 0.0000000
由于(在标志中)您将此描述为一个编码问题,并要求将其迁移到,因此我将这样做。您可能无法直接从任何现有的
R
软件包中获得所需的结果,在这种情况下,首先需要进行一些理论分析来说明如何进行计算,这将使您回到统计站点。
library(devtools)
## if you have macOS, grab this version of libstableR:
devtools::install_github("hrbrmstr / libstableR")
devtools::install_github(  "swihart/gnlrim")

## data: 4 individuals with 5 observations
dose <- c(9,12,4,9,11,10,2,11,12,9,9,9,4,9,11,9,14,7,9,8)
y <- c(8.674419, 11.506066, 11.386742, 27.414532, 12.135699,  4.359469,
       1.900681, 17.425948,  4.503345,  2.691792,  5.731100, 10.534971,
       11.220260,  6.968932,  4.094357, 16.393806, 14.656584,  8.786133,
       20.972267, 17.178012)
id <- rep(1:4, each=5)

## fit with lmer
lmer_fit <- lme4::lmer(y~dose + (1|id), REML=FALSE)

## fit with gnlrim
gnlrim_fit <-
gnlrim(y,
       mu=~a+b*dose+rand,
       random="rand",
       nest=id,
       pmu=c(a=8.7,b=0.25),
       pshape = c(shape=1),
       pmix=c(var=3.0938^2),
       p_uppb = c(10,  1, 5, 3.0938^3),
       p_lowb = c( 5, -1, 0, 0)
       )
## show fits are the same:

## intercept (a) slope (b)
summary(lmer_fit)$coeff[,1]
gnlrim_fit$coeff[1:2]

## Residuals standard deviation
## sigma_epsilon = 5.58
summary(lmer_fit)$varcor
sqrt(exp(gnlrim_fit$coeff[3]))

## random effects standard deviation
## sigma_id = 3.0938
summary(lmer_fit)$varcor
sqrt(gnlrim_fit$coeff[4])

## likelihood
summary(lmer_fit)$logLik
-gnlrim_fit$maxlike
## Take same model but hold constant
## random effects standard deviation
## sigma_id   :=  9
## sigma^2_id := 81
gnlrim_fit2 <-
  gnlrim(y,
         mu=~a+b*dose+rand,
         random="rand",
         nest=id,
         pmu=c(a=8.7,b=0.25),
         pshape = c(shape=1),
         pmix=c(var=9^2),
         p_uppb = c(10,  1, 5, 9^2),
         p_lowb = c( 5, -1, 0, 9^2)
  )

gnlrim_fit2$coeff
gnlrim_fit2$se
> ## show fits are the same:
> ## intercept (a) slope (b)
> summary(lmer_fit)$coeff[,1]
(Intercept)        dose 
  8.7117914   0.2488724 
> gnlrim_fit$coeff[1:2]
[1] 8.7118426 0.2488648
> 
> ## Residuals standard deviation
> ## sigma_epsilon = 5.58
> summary(lmer_fit)$varcor
 Groups   Name        Std.Dev.
 id       (Intercept) 3.0938  
 Residual             5.5880  
> sqrt(exp(gnlrim_fit$coeff[3]))
[1] 5.587926
> 
> ## random effects standard deviation
> ## sigma_id = 3.0938
> summary(lmer_fit)$varcor
 Groups   Name        Std.Dev.
 id       (Intercept) 3.0938  
 Residual             5.5880  
> sqrt(gnlrim_fit$coeff[4])
[1] 3.094191
> 
> ## likelihood
> summary(lmer_fit)$logLik
'log Lik.' -64.64964 (df=4)
> -gnlrim_fit$maxlike
[1] -64.64958
> ## Take same model but hold constant
> ## random effects standard deviation
> ## sigma_id   :=  9
> ## sigma^2_id := 81
> gnlrim_fit2 <-
+   gnlrim(y,
+          mu=~a+b*dose+rand,
+          random="rand",
+          nest=id,
+          pmu=c(a=8.7,b=0.25),
+          pshape = c(shape=1),
+          pmix=c(var=9^2),
+          p_uppb = c(10,  1, 5, 9^2),
+          p_lowb = c( 5, -1, 0, 9^2)
+   )
> 
> gnlrim_fit2$coeff
[1]  9.1349920  0.2012785  3.4258404 81.0000000
> gnlrim_fit2$se
[1] 6.1006729 0.4420228 0.3485940 0.0000000