计算每列的类内相关性 (ICC) 并返回包含结果的数据框

问题描述 投票:0回答:1

我有一个基于问卷的数据框,所有参与者都回答了 2 次问卷。在此基础上,形成了一个包含所有参与者和问卷项目的数据框。

数据框如下所示,(每一行都是不同的参与者(具有唯一 ID)。项目“_1”和“_2”代表所有参与者回答(两次)的问卷 1 和问卷 2 的数据。每个项目是一个问题,有20项(问题)):

edited df specific for icc

df <- data.frame(matrix(NA, nrow = 20, ncol = 130))
# Add the column names
colnames(df) <- c(paste0("ID", rep(1:65, each = 2), "_", rep(1:2)))
# Fill the dataframe with random 1's and 0's
df[] <- sample(0:1, size = nrow(df) * ncol(df), replace = TRUE)
# Set the row names
row.names(df) <- paste0("item", 1:20)
# View the dataframe
df

根据每个参与者填写的两份问卷的数据,我正在尝试计算每个项目的 ICC。

但是,目前我只能对整个数据框而不是每个项目执行 ICC。我试过:

icc_items <- function(item, df) {
  iccc <- ICC(df[item])
  data.frame(
    model =iccc$Model,
    type = iccc$Type,
    lowerbound = iccc$"lower bound"
    upperbound = iccc$"upper bound"
    p = iccc$p.value,
    icc = iccc$ICC,
    f = iccc$F.value )}
icc_col_names <- grep("^item", names(df), value = TRUE)
icc_col_names_list <- split(icc_col_names, factor(gsub("_[1|2]$", "", icc_col_names), levels = unique(gsub("_[1|2]$", "", icc_col_names))))
icc_items_list <- lapply(icc_col_names_list, \(item)
                           icc_items(item, df))
icc_items_df <- do.call(rbind, icc_items_list)
icc_items_df

上面的代码本来是用来计算不同的测试的,但是我调整了它以适应ICC,或者至少我试过了,但是它给了我一个错误。

  • 如何根据问卷的数据框计算每个项目的 ICC(每个 ID 每个项目有 2 个测量时刻),并最好获得数据框中每个项目的值
r dataframe correlation psych irr
1个回答
0
投票

在这里,我对数据进行子集化以仅获取与项目名称匹配的列。

names(df)[startsWith(names(df), "item1_")]
[1] "item1_1" "item1_2"

然后我将日期子集化为只有那些用于

icc
计算的列。然后将结果存储到数据框中。我包括了每个变量,但是任何不希望出现在最终结果中的变量都可以在
icc_item
函数中注释掉。我还为
Item
添加了一列,以在最终结果中包含它的名称。

在我的循环中,我通过删除下划线后面的计数器(即

Item##_1
Item##_2
)并仅保留项目名称(即
Item##_
)来遍历项目。这样,我们就不会遍历每一列的项目。

library(irr)
#> Loading required package: lpSolve

icc_item <- function(item, df) {
  items <- names(df)[startsWith(names(df), item)]
  iccc  <- icc(df[items])
  data.frame(
    Item       = gsub("_", "", item),
    Unit       = iccc$unit,
    Model      = iccc$model,
    Type       = iccc$type,
    Subjects   = iccc$subjects,
    Raters     = iccc$raters,
    ICC_Name   = iccc$icc.name,
    ICC_Value  = iccc$value,
    R_zero     = iccc$r0,
    f_value    = iccc$Fvalue,
    p_value    = iccc$p.value,
    Conf_level = iccc$conf.level,
    LowerBound = iccc$lbound,
    UpperBound = iccc$ubound
    )
    }

do.call(rbind, lapply(unique(gsub("_\\d+$", "_", names(df)[-1])), 
                      function(item) icc_item(item, df)))
#>      Item   Unit  Model        Type Subjects Raters ICC_Name    ICC_Value
#> 1   item1 single oneway consistency       51      2   ICC(1)  0.210110585
#> 2   item2 single oneway consistency       51      2   ICC(1)  0.059561129
#> 3   item3 single oneway consistency       51      2   ICC(1) -0.050583658
#> 4   item4 single oneway consistency       51      2   ICC(1) -0.009693053
#> 5   item5 single oneway consistency       51      2   ICC(1)  0.065420561
#> 6   item6 single oneway consistency       51      2   ICC(1)  0.015748031
#> 7   item7 single oneway consistency       51      2   ICC(1) -0.170960187
#> 8   item8 single oneway consistency       51      2   ICC(1)  0.217527387
#> 9   item9 single oneway consistency       51      2   ICC(1) -0.010101010
#> 10 item10 single oneway consistency       51      2   ICC(1) -0.050583658
#> 11 item11 single oneway consistency       51      2   ICC(1) -0.206225681
#> 12 item12 single oneway consistency       51      2   ICC(1)  0.068322981
#> 13 item13 single oneway consistency       51      2   ICC(1)  0.107835531
#> 14 item14 single oneway consistency       51      2   ICC(1) -0.257861635
#> 15 item15 single oneway consistency       51      2   ICC(1) -0.170960187
#> 16 item16 single oneway consistency       51      2   ICC(1) -0.170960187
#> 17 item17 single oneway consistency       51      2   ICC(1)  0.065420561
#> 18 item18 single oneway consistency       51      2   ICC(1)  0.065420561
#> 19 item19 single oneway consistency       51      2   ICC(1) -0.055512119
#> 20 item20 single oneway consistency       51      2   ICC(1)  0.068322981
#>    R_zero   f_value    p_value Conf_level  LowerBound UpperBound
#> 1       0 1.5320000 0.06622934       0.95 -0.06518802 0.45630382
#> 2       0 1.1266667 0.33631555       0.95 -0.21550364 0.32656452
#> 3       0 0.9037037 0.63942044       0.95 -0.31779681 0.22481267
#> 4       0 0.9808000 0.52695053       0.95 -0.28053345 0.26330168
#> 5       0 1.1400000 0.32128434       0.95 -0.20988735 0.33180948
#> 6       0 1.0320000 0.45529397       0.95 -0.25692969 0.28681788
#> 7       0 0.7080000 0.88804823       0.95 -0.42290398 0.10628753
#> 8       0 1.5560000 0.05951290       0.95 -0.05744511 0.46243585
#> 9       0 0.9800000 0.52809859       0.95 -0.28090929 0.26292193
#> 10      0 0.9037037 0.63942044       0.95 -0.31779681 0.22481267
#> 11      0 0.6580645 0.92951155       0.95 -0.45246363 0.07000525
#> 12      0 1.1466667 0.31394054       0.95 -0.20709863 0.33440144
#> 13      0 1.2417391 0.22185838       0.95 -0.16868338 0.36929158
#> 14      0 0.5900000 0.96800884       0.95 -0.49479045 0.01552848
#> 15      0 0.7080000 0.88804823       0.95 -0.42290398 0.10628753
#> 16      0 0.7080000 0.88804823       0.95 -0.42290398 0.10628753
#> 17      0 1.1400000 0.32128434       0.95 -0.20988735 0.33180948
#> 18      0 1.1400000 0.32128434       0.95 -0.20988735 0.33180948
#> 19      0 0.8948148 0.65240456       0.95 -0.32223304 0.22011490
#> 20      0 1.1466667 0.31394054       0.95 -0.20709863 0.33440144

创建于 2023-05-05 与 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.