草薙の研究ログ

英語の先生をやってます。

ステップワイズ多次元尺度構成法もどき

【背景】

多変数の相関関係を効率的に可視化するため(古典的)多次元尺度構成法(MDS)をするときがある。因子分析などをする前に見てみたりするとよい場合も多い。

多変数の相関関係といったらこちらの記事も。


多変数の相関を可視化する方法メモ - 草薙の研究ログ

 

それぞれの変数の付置を見たとき,たとえば,ひとつだけ,すごく遠くに付置されている項目,これがなければどうなるだろうみたいな,ときって多い。(別にあんまかわんないけど,これ捨てたいみたいな)

 

いちいち項目をひとつ抜くとか,そういうのがメンドイときもある。

もっと効率的にやりたい。もっと図を見ながらインタラクティブにデータを見れたらよい。

 

【Rで書いちゃえ】

やっていることはすごく簡単なのよね。データを入れ抜きたい項目だけ指定できればいい。

 

なので関数書きました。

 

swmds<-function(dat,step="F",rmi){
if(step=="F"){
plot(cmdscale(dist(cor(dat))),type="n",xlab="", ylab="",main="All data")
text(cmdscale(dist(cor(dat))),rownames(cor(dat)),col="blue")
}else{
plot(cmdscale(dist(cor(dat[-c(rmi)]))),type="n",xlab="", ylab="",main=paste("Removing",paste(rmi,collapse=", ")))
text(cmdscale(dist(cor(dat[-c(rmi)]))),rownames(cor(dat[-c(rmi)])),col="blue")
}

 

これは,swmdsという名前の関数で最大で三つの項を取ります。

基本的には

swmds(データ, step="T", c(抜きたい項目))

データはデータフレーム形式です。

 

エクセルからコピーをして,

dat<-read.table("clipboard",header=T)

とでもやれば,datという箱にデータを入れられますね。

 

stepは,Tだと,項目を抜くことを意味します。

デフォルトは項目を抜かないので,

例えば,

swmds(dat)

とやると,全項目をもちいたMDSを描きます。

こんな感じ。

f:id:kusanagik:20150122212742p:plain

 

ここから,項目を指定して抜いていきたいなら,

swmds(dat, step=T, c(3,8,9,18,20,24,26,28))

step=Tとしてください(おまじない)。

c()の中に抜きたい項目の列数を入れます。

ここで3,8,9,18,20,24,26,28みたいに。

そうするとこうなります。

f:id:kusanagik:20150122213210p:plain

これだけです。

 

因子分析などの予備調査でやった項目の精選に使える?かも?はて?

 

データの上書き

できたら,抜いた項目を保存できたらいいよね。

まったく関数を作るまでもないけど,ちょっとメンドイっていう初心者ユーザのために。

 

rmv<-function(dat,rmi){
dat[-c(rmi)]
}

 

 rmv(dat, c(1,2,3,4))

というようにしたら,datというデータフレームから,1ー4行目の要素を抜いている。

これを

dat2<-rmv(dat,c(1,2,3,4))

というようにしたら上書きできるね。