[]健診データのクラスタリング

利用ライブラリ:library(gplots); library(ggplot2)
主な関数   :heatmap.2(Data, density.info="none", trace="none", 
         hclustfun=function(d) hclust(d, method="ward"));
        ggplot() + geom_rect() + scale_x_continuous()

健診データをクラスタリングしてみる。

クラスタリングには変数方向と観測値方向の2種類がある。

同時に確認するのならヒートマップが良い。

f:id:isseing333:20100509163140j:image

対象者(横軸)は細かく分かれていてあんまり綺麗じゃないけど、変数(縦軸)は項目毎に分かれていそう。

体型・血圧・脂質・血糖・肝機能・尿酸・尿検査・貧血に分かれている。

これらの項目同士の相関はある程度あるけど、独立リスク因子として考えた方が無難っぽい。

法定階層化はそんなに間違ってないんだろうなぁ(まぁもともと批判の多くはウエストの基準に対してだけだったようにも思うし)。

また対象者の方をクラスタリングすると次のようになる。

f:id:isseing333:20100509164018j:image

上に挙げた因子はやっぱり一緒に動いている印象。

階層化のようにリスクカテゴリにして、二値変数で”リスクパターン”を探索した方が生産的かもなぁ。

クラスタリング結果を描いたコードは↓

(今回データは無しです)

#------クラスターごとの特徴を確認(yは1~15変数が検査値、16変数クラスターフラグ)
#---標準化した後平均値を出す
yScale <- apply(y[, -16], 2, scale)
ClusterMean <- apply(yScale, 2, function(d) tapply(d, y$cluster, mean))

#---HDLとHBはリスク方向が逆
ClusterMean[, 10] <- -ClusterMean[, 10]
ClusterMean[, 15] <- -ClusterMean[, 15]

ClusterMeanVec <- data.frame(mean=c(t(ClusterMean)), 
	label=rep(1:ncol(ClusterMean), nrow(ClusterMean)), 
	class=factor(rep(c(1:nrow(ClusterMean)), rep(ncol(ClusterMean), nrow(ClusterMean)))))

#---長方形と折れ線で確認(あまり綺麗じゃないなぁ)
library(ggplot2)
ggplot(ClusterMeanVec, aes(xmin=label+(as.numeric(class)-5)/11, xmax=label+(as.numeric(class)-4)/11, 
	ymin=0, ymax=mean, x=label+(as.numeric(class)-4.5)/11, y=mean, col=class, fill=class)) + 
	xlab(NULL) +
	geom_rect(alpha=0.3) + geom_line() + 
	scale_x_continuous(breaks=1:ncol(ClusterMean), labels=colnames(ClusterMean)) 

#---各クラスタの人数を追加
text(seq(5, 10, length.out=10), 1, 1:10)
text(seq(5, 10, length.out=10), 0.98, table(y$cluster))

ページTOPへ