[英]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。我很難找到一種可視化此數據的方法。 我想要一個內容豐富的圖表,其中包含:
在我的真實數據集中,我有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名患者可能有點過多。 有幾種解決此問題的方法:
關於最后一個建議,你可以做到這一點與下面的代碼(這是我改編自一個答案 ,以我自己的問題之一):
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)))
然后,您可以例如使用幾個分組變量(例如Month
, neverill
)聚合數據。
注意:對於第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"))
我們會沿着月份融化此數據框,以便我們可以創建構面圖。
如果沒有不正確的事件,我們將獲得類型的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.