簡體   English   中英

R:如何可視化隨時間變化的二進制/分類數據

[英]R: How to visualize change in binary/categorical data over time

>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。我很難找到一種可視化此數據的方法。 我想要一個內容豐富的圖表,其中包含:

  1. 參與者的測試分數隨時間變化的趨勢。
  2. 該趨勢與參與者隨時間的診斷相比如何

在我的真實數據集中,我有800多名參與者,所以我不想構造800個單獨的圖...我認為測試分數變量為二進制確實讓我感到困惑。 任何幫助,將不勝感激。

使用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()

這使:

在此處輸入圖片說明


正如問題評論中已經提到的那樣,在一個小區中包括800名患者可能有點過多。 有幾種解決此問題的方法:

  1. 匯總數據。
  2. 創建患者亞組並為每個亞組繪制一個圖。
  3. 過濾掉所有從未生病的患者。

關於最后一個建議,你可以做到這一點與下面的代碼(這是我改編自一個答案 ,以我自己的問題之一):

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 )聚合數據。

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

用途

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

比較

首先,將Dx從1更改為2,再將0更改為1(假設分數的0對應於Dx的1)

data$Dx <- data$Dx - 1

現在,創建一個矩陣,該矩陣對於0診斷的1診斷將返回1,對於1診斷0的診斷將返回-1。

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,則所有事件的診斷值= 1,diag =0。0表示兩者之間的平衡。
  • 度量:錯誤事件的原始數量。

我們會沿着月份融化此數據框,以便我們可以創建構面圖。

如果沒有不正確的事件,我們將獲得類型的NaN。 要將其設置為0:

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

最后,我們可以繪制

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

現在,我們可以在一個圖中看到:

  • 每月的陽性分數數
  • 診斷不足與診斷過度的比例
  • 錯誤診斷的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM