如何计算 ICC 的置信区间?

机器算法验证 r 置信区间 类内相关
2022-03-21 21:59:19

这是我用来计算 ICC 的 lmer 函数摘要的输出。

   Linear mixed model fit by REML ['lmerMod']
   Formula: CareChange ~ 1 + (1 | PROVIDER)
      Data: MEA_data_1

   REML criterion at convergence: 35.2

   Scaled residuals: 
       Min      1Q  Median      3Q     Max 
   -0.3093 -0.2829 -0.2711 -0.2599  3.6206 

   Random effects:
    Groups            Name        Variance  Std.Dev.
    PROVIDER          (Intercept) 0.0003096 0.01759 
    Residual                      0.0660667 0.25703 
   Number of obs: 239, groups:  PROVIDER_CALENDAR, 14

   Fixed effects:
        Estimate Std. Error t value
        (Intercept)  0.07119    0.01742   4.086

   ICC = 0.0003096 /(0.0003096 +0.0660667 ) = 0.004664315

我没有找到任何说明如何计算此 ICC 值的 CI 的文献。非常感谢您对此问题的任何帮助。

2个回答

计算置信区间的一种直接方法是创建自举分布,然后从该分布中获取相关分位数。这可以作为参数或非参数引导程序来完成,具体取决于您对哪些假设感到满意。通常,如果您接受随机效应的正态分布,则参数引导也是合适的。

由于您使用的是 R,因此该lme4软件包提供了一个非常好的参数引导函数,bootMer()用于计算从随机效应模型派生的任何感兴趣的统计数据的引导分布。完全实现了参数化方法,它使用每次迭代的随机效应的新值来模拟感兴趣的模型。使用来自混合模型的参数从正态分布中提取新值。bootMer()有关控制引导哪些效果的详细信息,请参阅文档。设置您自己的迭代次数,但 1000+ 是一个很好的经验法则。

要在 R 中进行计算,您需要拟合随机效应模型并将函数传递给bootMer()计算感兴趣的统计数据。下面是一个示例实现:

使用 R 的示例代码

#Make some mocked data
library(lme4)
library(reshape2)
set.seed(2024)  #For the Bell Riots
id <- factor(seq(1, 15))
id.mu <- rnorm(15, 10, 5)
mydat <- NULL
for (a in 1:length(id)){
  score <- rnorm(2, id.mu[a], 3)
  id.fr <- data.frame(id=id[a], score1=score[1], score2=score[2])
  mydat <- rbind(mydat, id.fr)
}
mydat <- melt(mydat, id.vars='id', value.name='score')

#Create function to calculate ICC from fitted model
calc.icc <- function(y) {
  sumy <- summary(y)
  (sumy$varcor$id[1]) / (sumy$varcor$id[1] + sumy$sigma^2)
}

#Fit the random effects model and calculate the ICC
mymod <- lmer(score ~ 1 + (1|id), data=mydat)
summary(mymod)
calc.icc(mymod)

#Calculate the bootstrap distribution
boot.icc <- bootMer(mymod, calc.icc, nsim=1000)

#Draw from the bootstrap distribution the usual 95% upper and lower confidence limits
quantile(boot.icc$t, c(0.025, 0.975))

我有同样的需求,这是我最终使用 irr 包更轻松地引导它的另一个解决方案。(也不太聪明,但如果它可以帮助未来的用户......)

我知道这个包给你一个置信区间以及 ICC 包,但是如果你因为分发而烦恼并且需要一个引导程序:

#create the matrix needed for your task
matrix <- select(dataframe, var1, var2) 

#you need to define the model, type and unit according to the question you're asking, here's for the example
irr:icc(matrix, model ="twoway", type = "agreement", unit = "single") 

#New fuction, [7] is to get the value we want (icc in this case)
icc.boot <- function(data,x) {irr::icc(data[x,], model ="twoway", type = "agreement", unit = "single")[[7]]} 

#bootstsrap distribution with 10 000 samples in this example
boot <- boot(matrix,icc.boot, 10000) 

# get the confidence interval 
quantile(boot$t,c(0.025,0.975)) 

# If you're unsure of the number of samples to choose, you can get a look of the distribution of the bootstrap 
hist(boot) 

我希望它有所帮助。