为多个读者整理重复的类内关联

时间:2017-10-10 10:59:13

标签: r dplyr tidyr psych broom

在我的数据集中,我有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))

最终目标是在每天的读者之间估计组内相关性(使用心理包中的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

1 个答案:

答案 0 :(得分:2)

我不知道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)

enter image description here

当然,您可以使用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")