Hatena::ブログ(Diary)

アイアナ:データ分析や人工知能(AI)などの技術雑記

2009 | 11 |
2010 | 02 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 03 | 04 | 05 | 10 | 12 |
2013 | 01 | 02 | 04 |
2014 | 03 | 12 |
2016 | 03 |
2017 | 10 |

2011-02-24

Self Organizing Map(SOM)の可視化

自己組織化マップ(SOM)はクラスタリングに使える!ということで、Rで試してみました。Rではsomパッケージやkohonenパッケージで絵の出力もしてくれますが、ちょっと図が綺麗ではないです。

そこで今回はggplot2で綺麗っぽく可視化してみました。データはirisを使います。プログラム→結果の順で進めます。



まずはいつものkohonenプロット


library(kohonen)
library(ggplot2)

Dim     <- 10				#SOMの次元
UseData <- do.call(cbind, iris[, -5])	#使用するデータ


GRID      <- somgrid(xdim = Dim, ydim = Dim, topo = "hexa")
DataSom   <- som(UseData, grid = GRID)

plot(DataSom, type = "mapping", labels = 1:nrow(UseData))

f:id:isseing333:20110224105433j:image


この結果にはirisデータの花弁とかの情報はまったく出ておらず、ただどのサンプルが"近いか"という情報だけを表現しています。

通常の階層型クラスタリング樹形図でサンプルの近さを示しているのに対して、SOMは2次元のマップで表現しているということです。



次に、この図に花弁の情報を色で付与します。


#---kohonen.plot
i <- 1				#チェックしたい変数の番号
plot(DataSom, type = "mapping", labels = 1:nrow(UseData), 
	bgcol = cm.colors(nrow(DataSom$codes))[rank(DataSom$codes[, i])])

f:id:isseing333:20110224101538j:image

cm.colorsのようなカラーパレットを使ってグラデーションを付けることで、花弁の情報を色で表現できます。

bgcolの中にあるrank(DataSom$codes[, i])で色の濃さを指定してます。

このiは変数の番号を示します。

DataSom$codesには各ノードのSOMでの推定値が格納されているので、これのランクで色分けしているのです。


図をみると、sepal.lengthで2群に分かれるんだろうな〜って事が示唆されます。



そして最後に、この図をもう少し見やすくするためにggplot2を使って描き直します。


DataHex       <- data.frame(DataSom$codes)
DataHexStd    <- data.frame(scale(DataHex))
DataHexStd$x  <- rep(1:Dim, Dim)
DataHexStd$y  <- rep(1:Dim, rep(Dim, Dim))

#---グラフ
HighCol <- "#950000"
LowCol  <- "#3500BF"



#---textの追加
DataSomMap   <- data.frame(Data = 1:nrow(UseData), 
		x = DataSom$unit.classif - trunc((DataSom$unit.classif - 1)/Dim) * Dim, 
		y = trunc((DataSom$unit.classif - 1)/Dim) + 1)
DataSomMap$x <- DataSomMap$x + runif(nrow(UseData), -0.5, 0.5)
DataSomMap$y <- DataSomMap$y + runif(nrow(UseData), -0.5, 0.5)
DataSomMap   <- cbind(DataSomMap, UseData)



#---ggplot2
q <- ggplot(DataHexStd, aes(x, y, col = DataHexStd[, i])) + 
	scale_colour_gradient2(high = HighCol, low = LowCol) + 
	geom_point(size = 160 / Dim, shape = 15) + 
	opts(legend.position = "none", title = names(DataHexStd)[i])
q + geom_text(data = DataSomMap, aes(x, y, label = Data, col = 0), size = 3)

f:id:isseing333:20110224101539j:image


どうでしょうか!?

きれいになってませんか!?



表現しているものはkohonenのプロットと同じです。それぞれのセグメントがノードを示して、色の濃さがノードの推定値です。赤が高い、青が低いです。

また、DataSom$unit.classifに各サンプルのSOMでのクラス番号が振られているので、これを使ってxとyの番号を作ってます。


このプログラムは基本的に変更しなくても、コピペで使えます(まぁどこかエラーが出る可能性はないことはないですがww)。

グラフを描くためにSOMを計算し直すのが面倒なので、関数にはしていませんが、最初のUseDataとかiとかを変えればいろいろ応用できます。

ggplotのsomだけど描くために、コピペ用のプログラムを下に書いておきます。



library(kohonen)
library(ggplot2)

#---ここのDimとUseDataを必要に応じて変更する
Dim     <- 10
UseData <- do.call(cbind, iris[, -5])
UseData <- scale(UseData)


#------SOMの実行
GRID      <- somgrid(xdim = Dim, ydim = Dim, topo = "hexa")
DataSom   <- som(UseData, grid = GRID)

DataHex       <- data.frame(DataSom$codes)
DataHexStd    <- data.frame(scale(DataHex))
DataHexStd$x  <- rep(1:Dim, Dim)
DataHexStd$y  <- rep(1:Dim, rep(Dim, Dim))

#---------グラフ
HighCol <- "#950000"
LowCol  <- "#3500BF"


#------textの追加
DataSomMap   <- data.frame(Data = 1:nrow(UseData), 
		x = DataSom$unit.classif - trunc((DataSom$unit.classif - 1)/Dim) * Dim, 
		y = trunc((DataSom$unit.classif - 1)/Dim) + 1)
DataSomMap$x <- DataSomMap$x + runif(nrow(UseData), -0.5, 0.5)
DataSomMap$y <- DataSomMap$y + runif(nrow(UseData), -0.5, 0.5)
DataSomMap   <- cbind(DataSomMap, UseData)


#------ggplot2
i <-1
ggplot(DataHexStd, aes(x, y, col = DataHexStd[, i])) + 
	scale_colour_gradient2(high = LowCol, low = HighCol) + 
	geom_point(size = 190 / Dim, shape = 15) + 
	opts(legend.position = "none", title = names(DataHexStd)[i])





このプログラムで、どのノードにどのサンプルが入っているかチェックできます。


#---check map
xMap <- 5
yMap <- 1

DataSomMap[(xMap - 0.5) <= DataSomMap$x & DataSomMap$x <= (xMap + 0.5) & 
	   (yMap - 0.5) <= DataSomMap$y & DataSomMap$y <= (yMap + 0.5), ]
mean(UseData[, i])


また、RapidMinerでもSOMができます。以前少し記事を書いていたので紹介です。


http://d.hatena.ne.jp/isseing333/20100604/1275636361


この結果は、等高線でサンプルの近さを表しているようです。サンプル自体の色は実際の観測値。だから、2次元上の距離が同じに見えても、色が違うところ同士は実際には遠いクラスターになってるって事です。あと、SOMは英語では「ソム」って発音するようです。

2011-02-22

測定誤差の調整+小技

医療データは特に測定誤差が大きいです。

例えば血圧とかは±10くらいは平気で動きます。

その測定誤差を統計的に補正しようという方法がいくつか提案されています。

俺が一番知っている研究者はCarroll先生。教科書はこれ。


Rでもいくつかパッケージになってるみたいでして、調べた限りではsimex、gbev、accuracy、deconに実装されているみたい。

まだ使ってないので使用報告はまだ今度。。。


あとデータハンドリングの小技。

なにかとウザいfactor(因子型)ですが、data.frame(, stringsAsFactors = F)のオプションを入れておくとfactorにはならないみたい。

これでデータフレームを転置してもfactorに強制変換されすに済む!?

2011-02-11

My biography (研究履歴)


Issei Kurahashi


Ph. D., Biostatistics

University of Tokyo

Email: i.kurahashi[at]gmail.com


An expert on gene expression data at Japan’s premier university currently interested in the unexplored area of electronic medical record analysis in Japan, an increasingly important field for understanding the medical and pharmaceutical industry. Past experience includes medical receipt data analysis for over 6 million Japanese patients covering 20 years, creating risk score models.


Areas of Focus:

  • Data Analysis (Medical, Economic, Agriculture, Industrial, other)
  • Market Research (QOL, Corporate Insurance)

Education:

University of Tokyo

Department of Epidemiology and Biostatistics, School of Health and Nursing

  • Doctor Course (expected 2011)
  • Master of Science, 2008
  • Bachelor of Science, 2006
    • University of Tokyo scholarship recipient 2006~

Specialization:

cDNA Microarray Data Analysis, Analysis of Clinical Trials, Receipts Data for National Health Insurance


Professional Experience:

  • Founding Member, Capital Medica, Co. Ltd, (2010-)
    • Core founding member for an independent business targeting companies seeking research related to the medical sector.
    • Analyze receipts for national health insurance and sell results to life insurance companies and pharmaceutical companies.
  • Consultant for Doctors, Teikyo University, (2009-)
    • Give advice to doctors about writing medical papers, including data analysis and paper content.
    • Provide data analysis consultation service for doctors in various fields (Internal Medicine, Surgical, ophthalmology)
  • Statistics Analyst, Statcom, Co. Ltd, (2007, 2009)
    • Analyzed and wrote a report concerning childhood cancer clinical trials data (Research Protocol-based)
    • Conducted Quality of Life research concerning postoperative Breast Cancer patients for a Ritsumeikan University Professor.
  • Data Analyst, NPO Japan Clinical Research Support Unit (2005)
    • Analyzed data related to renal cancer research using SAS
    • Wrote report based on analysis of Japanese National Health Insurance medical receipts using R software

Publications:

  1. Ryo Okazaki, Toshitsugu Sugimoto, Hiroshi Kaji, Yoshio Fujii, Masataka Shiraki, Daisuke Inoue, Itsuro Endo, Toshio Okano, Takako Hirota, Issei Kurahashi and Toshio Matsumoto. Vitamin D insufficiency defined by serum 25-hydroxyvitamin D and parathyroid hormone before and after oral vitamin D3 load in Japanese subjects. Journal of Bone and Mineral Metabolism. 2010; 29:1 103-10.

Academic Conferences:

  1. Shimozuma K, Shiroiwa T, Sagara Y, Tobata R, Ueo H, Kubota Y, Hori T, Amano K, Terada S, Mori M, Yajima T, Kurahashi I, Saito S, Hosaka T. Effects and Medical Costs of a Structured Psychosocial Group Intervention for Breast Cancer Patients after Surgery. ISPOR Annual European Congress. 2010.

Computer Skills/Software:


Language:

  • Japanese (native), English (not so much)