2015-05-04 60 views
2
>dput(data) 
structure(list(ID = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 
3, 3), Dx = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1), Month = c(0, 
6, 12, 18, 24, 0, 6, 12, 18, 24, 0, 6, 12, 18, 24), score = c(0, 
0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0)), .Names = c("ID", 
"Dx", "Month", "score"), row.names = c(NA, -15L), class = "data.frame") 

>data 
    ID Dx Month score 
1 1 1  0  0 
2 1 1  6  0 
3 1 1 12  0 
4 1 1 18  1 
5 1 1 24  1 
6 2 1  0  1 
7 2 1  6  1 
8 2 2 12  1 
9 2 2 18  0 
10 2 2 24  1 
11 3 1  0  0 
12 3 1  6  0 
13 3 1 12  0 
14 3 1 18  0 
15 3 1 24  0 

假設我有上述data.frame可視化二進制/分類數據的變化。我有3名患者(ID = 1,2或3)。 Dx是診斷(Dx = 1是正常的,= 2是有病的)。有一個月變量。最後但並非最不重要的是考試分數變量。參與者的測試分數是二進制的,它可以從0或1變化,或從1恢復到0.我很難想出一種方法來可視化這些數據。我想看一張信息豐富的圖表:R:如何隨時間推移

  1. 參與者的測試分數隨時間推移的趨勢。
  2. 如何這一趨勢隨着時間的推移

比較參與者的診斷在我的真實數據集我有超過800人蔘加,所以我不想建造800個獨立圖形...我認爲考試分數變量的存在二進制真的讓我難住。任何幫助,將不勝感激。

+2

在一張圖中有800個趨勢將是凌亂的,你不能聚合他們或什麼? – Soheil

+0

隨着時間的推移,病人得分可以在舒哈特圖表中查看,參見包裹qcc。您可以選擇特定於您的情況的EWMA,CUSUM或Shewhart,例如一個C圖[月計數]或一個U圖[每月費率]。 – Henk

回答

1

注意:對於第2部分,需要完成以下大量數據操作。第1部分不太複雜,您可以在下面看到它適合。

用途

library(data.table) 
library(ggplot2) 
library(reshape2) 

從1比較

首先,改變DX以2比0至1(假設在得分0對應於DX 1)

data$Dx <- data$Dx - 1 

現在,創建一個矩陣,返回1代表1代表診斷,0代表測試,-1代表1代表0代表診斷。

compare <- matrix(c(0,1,-1,0),ncol = 2,dimnames = list(c(0,1),c(0,1))) 
> compare 
    0 1 
0 0 -1 
1 1 0 

現在,讓我們給每一個事件打分。這只是中查找矩陣上爲你的矩陣中的每個條目:

data$calc <- diag(compare[as.character(data$Dx),as.character(data$score)]) 

*注:這可以加快使用匹配的大型矩陣,但它是較小的集像你

速戰速決爲了讓我們使用data.table聚集:

data <- data.table(data) 

現在,我們需要創建我們的變量:

tograph <- melt(data[, list(ScoreTrend = sum(score)/.N, 
          Type = sum(calc)/length(calc[calc != 0]), 
          Measure = sum(abs(calc))), 
        by = Month], 
       id.vars = c("Month")) 
  • ScoreTrend:計算每個 月份的正分數比例。顯示隨着時間的推移得分的趨勢
  • 類型:顯示隨着時間的過去-1與1的比例。如果這返回-1, 所有事件的得分= 1,diag = 0。如果它返回1,所有事件爲 diag = 1,得分= 0。零將意味着兩者之間的平衡
  • 測量:原始數量不正確的事件。

我們沿着月份融合這個數據框,以便我們可以創建一個構面圖。

如果沒有不正確的事件,我們將得到一個NaN類型。最後

tograph[value == NaN, value := 0] 

,我們就可以繪製

ggplot(tograph, aes(x = Month, y = value)) + geom_line() + facet_wrap(~variable, ncol = 1) 

現在我們可以看到,在一個情節:將它設置爲0

  • 積極分數按月數
  • 過低診斷比例
  • 不正確的診斷數量。
3

ggplot2你可以爲每個患者繪製小圖(參見我的解決方案,以處理大量的圖)。一個例子可視化:

library(ggplot2) 
ggplot(data, aes(x=Month, y=score, color=factor(Dx))) + 
    geom_point(size=5) + 
    scale_x_continuous(breaks=c(0,6,12,18,24)) + 
    scale_color_discrete("Diagnosis",labels=c("normal","diseased")) + 
    facet_grid(.~ID) + 
    theme_bw() 

這給:

enter image description here


包括800名患者在一個情節可能是有點太多,因爲已經在這個問題的評論中提到。這個問題有幾種解決方案:

  1. 聚合數據。
  2. 創建患者子羣併爲每個子羣繪製一個圖。
  3. 篩選出所有從未生病的患者。

關於最後的建議,你可以做到這一點下面的代碼(這是我改編自an answer到我自己的問題之一):

deleteable <- with(data, ave(Dx, ID, FUN=function(x) all(x==1))) 
data2 <- data[deleteable==0,] 

您可以使用此以及創建一個新的變量確定患者已經患病誰:

data$neverill <- with(data, ave(Dx, ID, FUN=function(x) all(x==1))) 

然後你就可以例如聚合與幾個分組變量的數據(例如Monthneverill)。

相關問題