2017-10-10 60 views
3

在我的數據集中,我有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不能有任何的意見的讀者)。其次,如何將ICC和95%CI提取到一個整齊的數據框中?

df %>% 
    group_by(day) %>% 
    nest() %>% 
    #something here to split data by day 
    do(ICC(.)) %>% 
    tidy() 
    #not working 

回答

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

當然,你可以做所有使用map()從purrr包一個管道。

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") 
+0

非常感謝 - 看起來不錯,但對我來說,無論是在這個MRE上,還是在真實的數據上,這都不起作用。錯誤:'bind_rows_(x,.id)中的錯誤:參數1必須是數據框或命名的原子向量,而不是心理/ ICC'。也許我的dplyr版本(0.7.2)? –

+0

抱歉有一個小錯誤,請參閱我的編輯。必須是'ICC(as.matrix(tmp))$ results' – Jimbou

+0

很棒 - 謝謝! –