バイナリの結果で長期データを視覚化する


8

数値の結果を持つ長期データの場合、スパゲッティプロットを使用してデータを視覚化できます。たとえば、次のようなもの(UCLA Statsサイトから取得):

tolerance<-read.table("http://www.ats.ucla.edu/stat/r/faq/tolpp.csv",sep=",", header=T)
head(tolerance, n=10)
interaction.plot(tolerance$time, tolerance$id, tolerance$tolerance, 
                 xlab="time", ylab="Tolerance",  legend=F)

ここに画像の説明を入力してください

しかし、私の結果がバイナリ0または1の場合はどうなりますか?たとえば、Rの「ohio」データでは、バイナリの「resp」変数が呼吸器疾患の存在を示しています。

library(geepack)
ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)
      resp  id age smoke
 2049    1 512  -2     1
 2050    0 512  -1     1
 2051    0 512   0     1
 2052    0 512   1     1
 2053    1 513  -2     1
 2054    0 513  -1     1
 2055    0 513   0     1
 2056    1 513   1     1
 2057    1 514  -2     1
 2058    0 514  -1     1
 2059    0 514   0     1
 2060    1 514   1     1

interaction.plot(ohio2$age+9, ohio2$id, ohio2$resp, 
                 xlab="age", ylab="Wheeze status", legend=F)

ここに画像の説明を入力してください

スパゲッティプロットは見栄えがよくなりますが、あまり有益ではなく、あまりわかりません。この種のデータを視覚化する適切な方法は何でしょうか?たぶん、y軸に確率値が含まれているものでしょうか。


1
まず、応答と年齢の平均をプロットすることから始めます。次のレベルは、各年齢でのトランジション00、01、10、11の割合を示している可能性があります。
Nick Cox

私の現在のバージョンのRにはohioデータがありません(2.15)(少なくともベースの一部として)。新しいバージョンですか、それとも他のライブラリですか?これは、Y軸に個人、X軸に結果を含むヒートマップの興味深いアプリケーションであり、1つの応答を黒、0の応答を白としてプロットします。行列を並べ替えると、さまざまなパターンがどのように蔓延しているかの概要がわかります。
アンディW

@Andy私は周りを偵察しなければなりませんでした... geepackパッケージの中にあることがわかりました。
Penguin_Knight 2013年

はい、申し訳ありません。上記の投稿を変更しました。
Emilia

記事「多変数の縦断データからのダイナミクス」(特にバイナリデータの場合)doi:10.1155 / 2014/901838をご覧ください。

回答:


14

これを回避する方法はいくつかあります。

変数を穏やかに揺らして線をばらまく

まず、年齢と結果の両方が適切に分離されているため、いくつかの傾向を示すために、それらを穏やかに揺らすことができます。秘訣は、線の色に透明度を使用して、重なりの大きさを識別しやすくすることです。

library(geepack)
set.seed(6277)

ohio2 <- ohio[2049:2148,]
head(ohio2, n=12)

jitteredResp <- ohio2$resp + rnorm(100,0,0.02)   # $
jitteredAge  <- ohio2$age+9 + rnorm(100,0,0.02)  # $
age          <- ohio2$age+9                      # $
id           <- ohio2$id                         # $
wheeze       <- ohio2$resp                       # $

#### Variation 1 ####
plot(jitteredAge, jitteredResp, type="n", axes=F,
     xlab="Age to the nearest year, jittered",
     ylab="Wheeze status, jittered")
for (i in id){
  par(new=T)
  lines(age[id==i], jitteredResp[id==i], col="#FF000008", lwd=2)
}
axis(side=1, at=seq(7,10))
axis(side=2, at=c(0,1),  label=c("No", "Yes"))

ここに画像の説明を入力してください

ファンシーを取得

このような曲線を使用して、被験者の流れを示すこともできます。これは上記のグラフの変更に似ていますが、重なりを使用するのではなく、線の幅を使用して周波数を表します。

ここに画像の説明を入力してください

各事件の運命を示す

これは直感に反するように聞こえるかもしれませんが、体系的にケースをレイアウトすると、集約されたストーリーを伝えるのと同じようにうまくいきます。ここでは、各ケースの結果が灰色の参照線に沿って示されています。ここには凡例を追加しませんでしたが、legendコマンドを使用すると簡単に追加できます。青は「応答= 0」で、赤は「応答= 1」です。時間(年齢)はx軸上に広がっています。あなたのデータは結果のパターンによって便利に事前に分類されているので、私は何もする必要がありませんでした。それらが事前にソートされていない場合はdcast、パッケージ内のようなコマンドを使用しreshape2てデータを少しマッサージする必要があります。

#### Variation 2 ####
my.col             <- vector()
my.col[wheeze ==1] <- "#D7191C"
my.col[wheeze ==0] <- "#2C7BB6"

plot(age, id, type="n", frame=F, xlab="Age, year", ylab="", axes=F, xlim=c(7,10))
abline(h=id, col="#CCCCCC")
axis(side=1, at=seq(7,10))
mtext(side=2, line=1, "Individual cases")
points(age, id, col=my.col, pch=16)

ここに画像の説明を入力してください

集計

視覚化が唯一の方法ではありません。せいぜい16個の異なるパターンしかないので、それらを表にまとめることもできます。使用+して、-同様のパターンを作成する+ + + ++ - - -、その後、これらのパターンのそれぞれについてのカウントとパーセンテージを添付してください。これにより、情報を等しく効果的に表示できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.