1人ずつグラフを描いてトレンドを把握する

グラフ

このブログでは、統計解析ソフトStataのプログラミングのTipsや便利コマンドを紹介しています.

Facebook groupでは、ちょっとした疑問や気づいたことなどを共有して貰うフォーラムになっています. ブログと合わせて個人の学習に役立てて貰えれば幸いです.

今回は、繰り返しデータの記述を図的に行う方法をご紹介します.

最近流行りの(?)リアルワールドデータの解析をするための下準備として、検査データなどの繰り返しデータを図にしてトレンドをなんとなく把握する、というような目的で描き始めました.

誰の役に立つかはわかりませんが、似たようなことをしている人もいるかもしれないので備忘録としてまとめました.

1.データセットと目標点

今回はオリジナルのダミーデータを使用します.

これは、腎機能を反復測定している症例なんですが、手術やICU入室がどのように影響するのかを見たり、基礎疾患によってどのように推移するのかを視覚的に理解するために作成した、というイメージです.実際の解析に入る前にデータをじっくりと観察するのが自分のスタイルなのですが、その一つの技としてお伝えします.

データセットをひらいてみます.describeと入力すると変数のリストを表示させることができます.

import excel using "repeated measured data.xlsx", firstrow clear
describe

目標とする図はこんな感じのイメージです.

緑は手術、黄色はICU入室を表す

600日付近でICUに入りましたが、このとき入院中のeGFRが徐々に上昇していっているのがわかります.

このとき何があったかわかりませんが、おそらく痩せてしまうような変化が起こったのではないでしょうか.筋肉量が落ちて見た目の腎機能は改善しているように見えます.

こういうことがあるんだなーということを図で理解してもらうのにはもってこい、ということになります.

図中に埋め込んだエレメントを順に説明していきます.

2.具体的な手順

1.左肩の患者属性

これには少々仕込みが必要です.

まず値ラベルをそれぞれの変数に振っておきます.DMがある場合にはYes、ない場合にはNoと表示させるわけです.

そして、値ラベルを表示させるため, これらをlocal変数に格納します.

label define yesno 1 "Yes" 0 "No"
label values chf yesno
label values cancer yesno
label values dm yesno
	
local x = dm
local dm "`: label (dm) `x''"
local y = chf
local chf "`: label (chf) `y''"
local z = cancer
local cancer "`: label (cancer) `z''"

特に後半部分の値ラベルを表示させるテクはちょっと覚えにくいですねー。毎回このページをみるようにしましょう.

2.時系列に差し込み

次にICU入室、手術実施のタイミングを差し込みます.

わかりやすく、この工程のみを取り出してプログラムを書きます.

まず、local変数に手術・ICU入室までの日数を格納します.

そしてそれをtwowayのオプション、”xline”の中に配置しましょう.ここではわかりやすくICU複数入室してても最初の1回だけ入れるようにします.

import excel using "repeated measured data.xlsx", firstrow clear
keep if pid==433
	local daystoope = opedate - b_date 
	local daystoicu1 = icudate1 - b_date  

twoway connected egfr daysfrombl, ///
	xtitle("最初のeGFR測定からの経過日数(日)") ///
	xline(`daystoope' , lw(vthick) lcolor(green%50)) ///
	xline(`daystoicu1', lw(vthick) lcolor(yellow%50)) ///
	ytitle("eGFR") yscale(range(0 60)) ylabel(0(20)60) 
緑は手術、黄色はICU

これで、入院中の採血ポイントの色を変えたい場合には、散布図を同じtwowayグラフに重ねます.

import excel using "repeated measured data.xlsx", firstrow clear
keep if pid==433
	local daystoope = opedate - b_date 
	local daystoicu1 = icudate1 - b_date  

twoway (connected egfr daysfrombl) ///
       (scatter egfr daysfrombl if 入外=="入院", mcolor(maroon)), ///
	xtitle("最初のeGFR測定からの経過日数(日)") ///
	xline(`daystoope' , lw(vthick) lcolor(green%50)) ///
	xline(`daystoicu1', lw(vthick) lcolor(yellow%50)) ///
	ytitle("eGFR") yscale(range(0 60)) ylabel(0(20)60) ///
        legend(order(1 "外来検査" 2 "入院中検査"))

どうやらもう一度間に入院があったようですが、それほど影響はなさそうです.

3.1人1人のグラフを作って保存する

IDを一人ひとり取り出していくことと、それを特定のフォルダに格納することを指定して、ループで回してあげましょう.

一人ひとりのIDを取り出すのは、levelsofでできますね!そしてそれをそのままループに入れるときは、以下のような骨格にはめることです.

ついでにグラフをエクスポートする方法ですが、

graph export “(フォルダ名)/ファイル名”, as(画像ファイルの種類) name(“Graph”)

が基本形です.今回は画像ファイルが容量を食わないように、PNGで作成してみました.

levelsof pid, local(levels)
foreach v of local levels {		
  preserve
	keep if pid ==`v'
	(中略)
    graph export "${wd}figure/`v'.png", as(png) name("Graph") replace
  restore
}		

そして、最終的に次のようなプログラムになります.後の細かいところはご自分でカスタマイズしてみてください.

global wd "C:\Users\...(自分の指定するDirectory)...\"
import excel using "repeated measured data.xlsx", firstrow clear
	label define yesno 1 "Yes" 0 "No"
	label values chf yesno
	label values cancer yesno
	label values dm yesno
	
levelsof pid, local(levels)
foreach v of local levels {		

	preserve
		keep if pid ==`v'
		local x = dm
		local dm "`: label (dm) `x''"
		local y = chf
		local chf "`: label (chf) `y''"
		local z = cancer
		local cancer "`: label (cancer) `z''"
		local daystoope = opedate - b_date 
		local daystoicu1 = icudate1 - b_date  

#delimit	
	twoway (connected egfr daysfrombl ) 
	||
	(scatter egfr daysfrombl if 入外=="入院", mcolor(maroon))
	||
	,
	xtitle("最初のeGFR測定からの経過日数(日)") xline(365 730, lw(vthin) lcolor(black) lp(dash)) 
	xline(`daystoope' , lw(vthick) lcolor(green%50))
	xline(`daystoicu1', lw(vthick) lcolor(yellow%50))
	ytitle("eGFR") yscale(range(0 60)) ylabel(0(20)60)  
	yscale(range(0(30)90)) ylabel(0(30)90, ang(0) nogrid) graphregion(color(white))
	legend(order(1 "外来検査" 2 "入院中検査")) text(90 50 "PID: `v'" "DM: `dm'" "CHF: `chf'" "Cancer: `cancer'")
	
	;
#delimit cr	
	graph export "${wd}figure/`v'.png", as(png) name("Graph") replace
restore
}		

まとめ

いかがでしたか?まあ、あまり直接的には論文などに使うことはないとは思いますが、ざっくりと傾向をつかんだりするのにこういうことは結構やってます.

サムネ表示にしてあげればそれなりに全体を俯瞰してみることも簡単にできますのでお勧めです.

コホートのデータクリーニングの外れ値を処理するときなんかに役立ちました.数学的に解決する方法もあるのですが、(Cookの距離とか)もうちょっと直観的な方を好む人の場合にはグラフを描けるというのも一つの武器になるかなーと個人的には思ったりします.

コメント

タイトルとURLをコピーしました