在我的数据集中,我有 5 位读者,他们在多天内重复对测试进行分类(如 0、1 或 2)。

在每天的 5 项测试中,只有 2-3 名读者实际进行了分类。

library(tidyverse)
library(broom)

df <- tibble(day = rep(1:10,10)) %>%
  arrange(day) %>%
  mutate(reader1 = rep(c(1, 2, 0, 0, 2, NA, NA, NA, NA, NA), each = 2, 5),
         reader2 = rep(c(NA, NA, NA, NA, NA, 1, 1 , 0, 1, 2), each = 2, 5),
         reader3 = rep(c(1, 1, 1, 0, 2, NA, NA, NA, NA, NA), each = 2, 5),
         reader4 = rep(c(NA, NA, NA, NA, NA, 2, 1, 0, 1, 2), each = 2, 5),
         reader5 = rep(c(NA, NA, NA, NA, NA, 2, 2, 0, 1, 2), each = 2, 5))

最终目标是估计每天读者之间的类内相关性(使用 psych 包中的 ICC 命令)。理想的输出将是一个单一的数据帧,其中包含每天的 ICC(和 95% 置信区间)以允许绘图。

This 答案很有帮助,但仅适用于恰好有两个读者的情况。

我被困的地方:

首先,对于每一天,删除读者没有分类测试的列(我认为这是必要的,因为 ICC 不能有没有观察的读者)。
df %>%
  group_by(day) %>%
  nest()
  #something here to drop non-readers
  select_if(colSums(!is.na(.)) > 0)
  #doesn't work. Need to slice into separate data frames?

其次,如何将 ICC 和 95% 的 CI 提取到单个整洁的数据框中?
df %>%
  group_by(day) %>%
  nest() %>%
  #something here to split data by day
  do(ICC(.)) %>%
  tidy()
  #not working

最佳答案

我不知道 ICC 和预期的输出,但是您可以尝试这种方式吗?
首先按天拆分数据,然后删除丢失的测试,例如删除读者未对测试进行分类并计算 ICC 的列。

res <- lapply(split(df, df$day), function(x){
  tmp <- x %>% gather(key, value, -day) %>%
    group_by(key) %>%
    mutate(test=1:n()) %>%
    filter(!is.na(value)) %>%
    spread(key,value) %>%
    select(starts_with("reader"))
    ICC(as.matrix(tmp))$results
  })

最终数据可以再次使用tidyverse进行分析。
res %>%
  bind_rows(.id = "day") %>%
  ggplot(aes(type, ICC)) +
     geom_col() +
     facet_wrap(~day)

r - 多个读者的整洁重复的类内相关性-LMLPHP

当然,您可以使用 purrr 包中的 map() 在一个管道中完成所有操作。
library(tidyverse)
library(psych)
df %>%
  split(.$day) %>%
   map(~gather(.,key, value, -day)) %>%
   map(~group_by(.,key)) %>%
   map(~mutate(.,test=1:n())) %>%
   map(~filter(.,!is.na(value))) %>%
   map(~spread(.,key,value)) %>%
   map(~select(.,starts_with("reader"))) %>%
   map(~ICC(as.matrix(.))$results) %>%
   bind_rows(.id = "day")

关于r - 多个读者的整洁重复的类内相关性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46665043/

10-12 22:42