月別アーカイブ: 2011年5月

不正なマルチバイト文字に七転八倒した。

分散分析までなんとかかんとかできるようになったので、本格的に自分の研究のデータを分析しようと思ったのだ。

本当は時間がないのでSPSSを使おうとしたのだけど、N先生から
“逃げ場を無くせ!!”との激。

ちなみにN先生は、ヒゲ付き棒グラフを美しく仕上げるために七転八倒している。

よーーしわかったよ。やるぜ!!

ということで、データを読み込むところから始める。

データの概要は、

だいたい300人分のデータで看護師さんと准看護師さんのデータ。
前半部は、年齢、性別、勤務形態などのデモグラフィックデータで後半部は3つの質問紙の質問項目のスコア。
ファイルは、nslpnsとしてcsv方式で保存(もちろん作業ディレクトリに)

これを読み込んだら、subset関数などを使ってソートを掛けながら少しずづ分析に向けて進めていくのだ。

エクセルで変数名を分かりやすく形成して、よし読み込むのみ。

Rでやれば、あとからどんなふうにデータを形成したのかがよくわかるのだ。

まずはRstudioを開いて、file→new→Rscript でエディタを開く。

f:id:jigawa91:20110531222122p:image

今回は、看護師と准看護師さんのデータなので、nslpnsと名前をつけとこう。

エディタの左上のフロッピーマークをクリック。

こんな感じのが出てくるのでファイル名を付けて保存。
この時にwhereの部分をRの作業ディレクトリに変えておくのを忘れちゃだめ。

f:id:jigawa91:20110531222124p:image

フフ。コマンドをエディタにいれてみる。
データの読取はもう出来るもんね。

s<- read.csv(“nslpns.csv”,header=T,sep=’,’)

!!

f:id:jigawa91:20110531222125p:image

なんだよ。不正なマルチバイト文字って。

この後、約3時間ほどマルチバイト文字と戦う。

txt方式で読み込もうとしたり、csvデータをいじってみたり。

よくわかんないが、マルチバイト文字という奴は文字形式の問題らしいが、元データはきっちりしてるつもりなんだけどな。。。
UTFとshift JISの問題だとかなんとかようわからんので誰か教えてください。

いろいろ四苦八苦して、新たなコードをネット上で見つける。一応これで読み込めた。

lowdate1<-file(“nslpns.csv”,encoding=”Shift-JIS”)
lowdate2<-read.csv(lowdate1,,header=T,sep=’,’)

よくわかってないけど、たぶん一行目はcsvを読み込むときにShiftJISで読み込んでねということみたい。

膨大な量のデータなので、どっかで間違えて邪悪な文字を使ってしまってだんだろう。

ふう。燃え尽きた。続きはまた今度にしよう。

二元配置の分散分析

そうそう。今日は二元配置の分散分析にチャレンジ。
おっと対応はありませんね。

Rstdioを使ったことでずいぶん直感的な使い方ができるようになった。

二元配置の分散分析のコマンドは、summary(aov(s$weight~s$race*s$sex))

従属変数が最初で~でつないで*で交互にみたいな感じかな。
この*は:でもいいらしいがまあこのままで。

Rstudioのスクリーンショットを見てみる。
f:id:jigawa91:20110528162736p:image

右上のエディタで作った二元配置の分散分析.Rを左上のコンソールに読み込んだ形式になる(RunAll)。

読み込むと左下ワークスペース(黒い円の部分)にデータフレームがセットされてる。

ここではコマンド1行目のs(いわゆるローデータ)とコマンド7目のs2(分散分析の結果)がデータセットされていると考えたらいいのだろう。

この読み込んだデータフレームは、保存をするとずっとそのままになる。
コンソールの消去は、とりあえず机の上を片付けるようなものだけど、ワークスペースの消去は頭の中をリセットする様なものかな。

ところで、結果だが、p値を見ると、このデータではsexのみが有意。

だから、体重に関しては性の主効果は有意、人種の主効果、及び交互作用はなしという見方になる。

酔っ払っているので今日はここまで。

ちょっとanobakun http://www11.atpages.jp/~riseki/pukiwikiplus/index.php?ANOVA%B7%AF

をやってみたのだけど、これは詳しい人が作成したプログラムを読み込むタイプなのでまた別カテゴリーでやってみます。

自分でできないことだけど、理解しつつやろうと思う今日この頃。
奥が深いな。

Rstudioにチャレンジ2

ということで怒涛の更新。

前回の設定でもう一度開いてみる。

f:id:jigawa91:20110526184456p:image

ほうほう。作業ディレクトリの中にあるファイルは全て右下で管理してくれている。左下は正しくコンソールなんだな。

えっとこのめんどくさいブツブツ書いてあるのを消すのはどうだったけ??

edit→Clearconsole でOK。

配置に関して、多分それぞれいろいろやり方があるんだろうけど、僕の好みにちょっと変えてみよう。おおおサイズも結構変わるんだね。

変更は前回のRstdio→Prefarances→Panelayoutで。

f:id:jigawa91:20110526184457p:image

僕は今まで流れに沿って、左にコンソール。右にエディタを配置。ワークスペースブラウザとFileはもともと使っていなかったのでちょっと小さめに配置してみた。

さて、これでちょっと昔ののデータを読み込んでみよう。

f:id:jigawa91:20110526184458p:image

おおすげー。右上にタブが出来てる。Spacesに近い感じなんだろう。ということは同時に何個もプラグラムファイルを開けるんだな。何個か開いてみる。

うん。これは間違いなく使いやすい。お金が取れるレベルだ。

f:id:jigawa91:20110526184459p:image

では次にちょとRを走らせてみよう。前回やったt検定と一元配置の分散分析にチャレンジ。

エディタ右上のRun Allをクリック。ちなみにRun Lineは読んで字のごとく一行のみコマンドを実行するみたいだ。

f:id:jigawa91:20110526194009p:image

左のコンソールに source(‘~/) とかなんとか書いてある。
これはエディタの内容を読み込んだという状態のことを指すのだろう。

!!

左下になんかある!!そうかそういうことか、このワークスペースは、コンソールに読み込んでいる内容を分かりやすく表示してくれているんだな!これは便利。

試しにコンソールにコマンドを打ち込んでみる。

f:id:jigawa91:20110526194010p:image

おみごと。前と同じデータが出てきました。パチパチ。

このまま保存すれば、次回はこの状態のままワークスペースは復活する。もし最初からしたければ、
WorkSpace →Clear all でOK。

いやあRstudio恐るべし。

多分これでRstudioはほぼ大丈夫かな?

(追加)
ちょっと追加
Rstudio → Preferences → Editing でHighlight selected line
にすれば、エディタの実行中にコマンドにラインがはいるので便利。

f:id:jigawa91:20110528143534p:image

Rstudioにチャレンジ

本当は二元配置の分散分析を仕様と思ったのだが、話題のRstudioをインストールしてみる。

ダウンロード先はこちら。

http://www.rstudio.org/

こんな画面があって。
f:id:jigawa91:20110526152317p:image
こんな画面があるので、デスクトップの方をダウンロード。
f:id:jigawa91:20110526152318p:image

続いてまたしても英語でちょっと緊張するが、リンゴのマークを信じましょう。
f:id:jigawa91:20110526152319p:image

さてダウンロードしたファイルをインストールしてみる。アプリのマークはRをちょっと可愛らしくしたような感じ。

このアプリそのものはRに乗っかるような感じでできているらしく、もともとのRは自動的に読み取られるみたいだ。

早速起動。
f:id:jigawa91:20110526180852p:image

うん。なんか出てきた。結構直感的なインターフェースだな。。。

でも全部英語だよ。こんちくしょう。

たちまち環境設定をみてみよう。
Rstudio→Preferencesの画像。

f:id:jigawa91:20110526180853p:image

まず一行目のDefault CRAN mirrorがわからん。なんなんじゃろこれ?

2行目のInitial working directoryは多分作業ディレクトリの変更。これは前と同じようにデスクトップの中のRフォルダにしてみる。

その下のRestore .RData into workspace at startup は最初からなので、多分設定の保存だろう。

Restore .RData into workspace at startup

は保存の設定。なにも考えずaskのままでいいと思う。

他のとこもいろいろ見てみたが正直よくわからんなあ。とくにAppearance のとこはちんぷんかんぷん。

ただ多分、このRstudioのキモは Pane Layout になるんだろうな。

f:id:jigawa91:20110526180854p:image

左上にプログラムソースが開き、その下がコンソール。
右上がワークスペースブラウザ(未だにいまいち意味が分かっていないのだが)でその下にちょっとしたグラフか。

使いこなしたら結構楽しそうだな。2元配置の分散分析はちょっとおやすみしようかな。。。

分散分析(一元配置の分散分析)

t検定について考えていたらまたわからんくなったので、改めてやって見ることにした。

最初の頃の気持ちを思い出して丁寧にやっていく。だって結果がでて喜んでるだけでは結局使いにくいSPSSと同じだもん。ちゃんと勉強しましょう。

まずは、等分散性の検定について検討(F検定と呼ばれるもの)。

t検定とは違うところは、複数あることか。ちょっとおんなじ感じでやってみっと。3種類ある人種でトライ。

f:id:jigawa91:20110526112313p:image

むむむエラーだ。なんでだろう。ちょっと本を読んでみよう。

わかった(多分ね)!!

3群以上の時は、bartlettを使うみたい。

bartlett.test(s$weight,s$race)

さあ出てこい!!

いえーーす!!これもp-value = 0.04765なので等分散性が棄却されます。サンプル数が少ないもんね。

ということで、等分散を規定しない分散分析。

ひつこいけどこれがデフォルトなんだよね。oneway.test

f:id:jigawa91:20110526115202p:image

っとこれをみると、 p-value =0.3214 なので体重に人種の影響はないことがわかった。

一応、等分散を規定した上での分散分析も練習のためにしてみる。
t検定の時と同じでvar.equal=TRUEを付ける。

f:id:jigawa91:20110526115203p:image

うん。p-value = 0.138で結果はかわらない。でも思ったより数字に変化があるんだな。

ところで、Rで分散分析には他にもいろんな種類があるみたいだ。本で読んだ限りでは、
aov関数(summaryも追加して結構一般的に使える、2元配置もできる)
anova関数(結構高度らしい)
anovakun関数(ツイッターで教えてもらったが、まだちょっと僕には早そうだ)

ここらへんを一応やってみよう。
ちなみに今気づいたのだが、summaryという関数はなんかざっくり見やすくしてくれるコマンドみたい。
試しにちょっとsをぶち込んでみる。

f:id:jigawa91:20110526115204p:image

ほほう。なんかいい感じの表ができてる。たぶん、customとInheは順序尺度であることを一度どこかで定義付けせんとあかんみたいやな(なんで大阪弁だよ)。これはまた今後にしよっと。

ではまず、aovから。比較のためoneway.testの等分散とそうじゃないやつを上に並べてみた。

f:id:jigawa91:20110526122453p:image

!! あれ?aovはデフォルトが等分散を規定しているのか??なぞだなあ。

ちなみにanovaだとこうなる。

f:id:jigawa91:20110526122925p:image

こっちもそうだ。僕の中の認識では、デフォルトが等分散を規定していなくて、等分散よりも統計的なハードルが高いので気にしなくても大丈夫という感じだったんだけどちょっと違うのかな。。。
これは調べても見つからない。誰かに聞くべきか。ということで悩んでいたらツイッター上でmentionが。そもそもanovaは等分散を想定しているものだから、等分散以外はやっちゃいけないとのこと。

そういう場合は、oneway.testでやるのが普通らしい。
でもだったら2元配置の分散分析をするときはどうなんだろう?twoway.testみたいなのがあるのかな?
ということで次は二元配置の分散分析にチャレンジ。そして、anovakunもやってみよっと。

ところで、分散分析ではTukeyの下位検定が出てくるものが多い。
Rではこうなる。

TukeyHSD(aov(s$weight~s$race))

f:id:jigawa91:20110526122926p:image

ok!だいぶいい感じですね。

t検定(追加)

ちょっといまいちわかってないのでもう一度最初からやってみる。

まずは、等分散性の検定について検討(F検定と呼ばれるもの)。
僕が習った方法としては、t検定では(分散分析でも)まず実際の分析にかける前に、このF検定を行って調べたい両者が同じ分散を持っているか、否かを判断する必要があるという。

もちろん、Rにもその関数はあった。

var.test というものだ。

今回のデータでは、体重のばらつきが、男性でも女性でも一緒なのか?という意味になる。バラつきが一緒な場合と、ばらつきが違う場合では検定の方法が違いますよということらしい。

(これは青木先生のページを見ると、必ずしもやらなくても最初から等分散を規定しない方法でやればいいとのことだが、難しいことはよくわからないので一応原則通りやってみる)

早速やってみよう。

f:id:jigawa91:20110526105221p:image

ふむ。なんか出てきた。だいぶ分かってきた感じもするなあ。

これの見方は、えっとp-value = 0.03822 だから。。。

これは当分散性が棄却されたということに違いない(間違っていたら誰か教えてくれ)。

ということで、この場合には体重のばらつきは男性と女性で同じではないので、そのための分析をしなさいね。ということになるのだ。

Rではデフォルトでウェルチなので(等分散を規定しない)

t.test(s$weight~s$sex) となりました。

f:id:jigawa91:20110526105222p:image

これは、 p-value = 0.001493 なので有意。男女間で体重には有意な隔たりがあるということだな。

※こういったデータの場合は普通は当分散になるはずだけど(実際に僕の少ない経験ではここが棄却されることはほとんどない。もし、棄却されたらなんか間違ってるかと思って見直す感じ)たぶん、この練習データはあまりにも人数が少ないので棄却されたんだろうと思う。

ということで、もし等分散性が棄却されなかったらどうするか?

その場合には、var.equal=TRUE を追加すればいい。

f:id:jigawa91:20110526105223p:image

確かにあんまり数字としては変わらないね。。。

状況に応じて使い分けるという感じかな。。

だれかわかり安く教えてくれる人がいればお願いします。

χ二乗検定

練習用のデータでできそうな分析としてはχ二乗があった。

本当は残差分析という奴もあるらしいがまあ練習なのでちょっとほっとこう。

χ二乗検定は独立性の検定。

カテゴリカルデータ同士になんらかの関係があるかどうかを検定するものなので、例えば無作為に100人の外人さんを抽出したときに、人種と性別の間に一定の特徴があるかどうかみたいな検定を行うものだ。

よくある分析としては、エクセルなどの表を作成したそれぞれのセルがお互いに関係しているかどうかを検定するという考え方。

ここでいうと、ちょっと分かりにくいが性別によって人種に一定の傾向があるかどうかの検定ということになる。

まずは、Rで表を作成する。
これは読んで地のごとしtable というコマンドを使うみたい。

いつものように、カテゴリカルデータの定義づけも含めてコマンドを入力。

s<- read.csv(“yome.csv”,header=T,sep=’,’)
s$sex<-factor(s$sex,levels=0:1,labels=c(“male”,”female”)) s$race<-factor(s$race,levels=0:2,labels=c(“white”,”black”,’yellow’))

  • table(s$sex,s$race)

これでどうだ??

f:id:jigawa91:20110521221724p:image

イエス!!次にこのテーブルをデータフレームに設定して(ここれはvと名づけてみた)、chisq.testを使う。

f:id:jigawa91:20110521221725p:image

なんかできたぽいが、、、よくわからんメッセージ。

警告メッセージ:
In chisq.test(v) : カイ自乗近似は不正確かもしれません

グーグル先生!!

http://www.aichi-gakuin.ac.jp/~chino/psycstat/chapter7/sec7.html

どうやらtable の中の数が少なすぎると計算そのものはしてくれるけど、出てきた数字には信頼性がないという事みたい。

ふむふむそういう場合にはどうしたらいいのかしら??

どうやらこういう場合にはフィッシャーの正確検定というのをやるらしいね。これはオッズ比というヤツともカラムみたいだけど、今んとこは無視!!

フィッシャーの正確検定をやってみる。
関数はfisher.test

f:id:jigawa91:20110521221726p:image

できた。今日は調子がよいらしい。

ここの結果としては、人種と性別は独立しているということ。
なんとなく、データに偏りがないという認識でもいいのかな。

実際に使うときにまた考えてみることにしよっと。

t検定と分散分析

今日は分散分析を行ってみようと思ったのだ。
僕がいつも分散分析はWeb Anova(http://www.hju.ac.jp/~kiriki/anova4/)を利用しているが、もちろんRでも出来るだろう。

改めて分散分析について考えてみると、自分がよくわかってなかったことに気づく。 っということでメモ。

今回の練習用データで考えてみると、荒っぽく考えてみと分散分析は、要因の多いt検定。

男女によって体重の平均値を比べるときの検定はt検定を行うことができる。2つの平均値を比べるのでこれでよい。

ただ、黒人と白人と黄色人種によって体重が異なるかどうかを検定するためには、分散分析を使う。
えっ??だったらt検定を2回すればいいんじゃないの?ということになるのだが、どうやらダメらしい(第二種の過誤というのが起きるらしい)。

ということで、今回のデータで分散分析を行ってみる。

こんな感じ。関数は一元配置はoneway.test

f:id:jigawa91:20110521205754p:image

ほほう。 anovaで見るような表ができた。
この結果だと、p-value を見るとどうやら人種と体重の相関はないみたいだ。

これは一元配置の分散分析。水準数は白、黒、黄色の3水準であるといえる。

余談だがもし、2水準で分散分析を行った場合、t検定と同じ結果になるらしい。ちょっとやってみよう。

まずは、t検定。男女によって体重に差があるのか?

f:id:jigawa91:20110521205755p:image

続いて、一元配置の分散分析を2水準で。

f:id:jigawa91:20110521205756p:image

OK!!なんか勉強になるなあ。改めて基礎から勉強している感じ。
あれ??そういえば、下位検定はどうやって出すんだろう?
まあ、とりあえずおいておいてここまでは一元配置の分散分析。

分散分析は一元配置ではなくこの配置の数を増やしていって交互作用ということも考えることができるらしい。

ここの例で言うと、
人種ごとに体重に差があるか?(人種の主効果)
性別ごとに体重に差があるか?(体重の主効果)
人種×性別ごとに体重に差があるか?(交互作用)

ということらしい。理論的にはいくらでも増やせるみたいなんだけど、解釈が難しくなるので2元配置くらいまでが普通ということ。

ではこの2元配置の分散分析をしてみる。関数はaov

f:id:jigawa91:20110521205757p:image

なんのことやらよーわからんので、もうちょっと勉強してみよう。summary()を追加してみる。

コマンドは、summary(aov(s$weight~s$race+s$sex))

f:id:jigawa91:20110521205758p:image

おお!なんかそれっぽいのが出てきたぞ!!

これあってんのかな???

性別の主効果は有意、人種の主効果はなし。
交互作用は何処?

試しにWeb Anovaで計算してみると数字がちょっと違う。。。改めてやってみると入力が結構大変だったなあ。
そうか、当分散の検定か。Rはウェルチがデフォルトなんだ。

ううーーん。酔っ払ったので今日はここまで。
というか本を忘れたので、ちょっと尻切れトンボですな。

今日の課題(というか本を見つけて追記すること)
1) tukeyの下位検定について
2) 交互作用はどうやって出力する?
3) 当分散を仮定しない分散分析を行ってその結果とWeb anovaの結果を照会する。
4) 当分散性の検定ってどうやるんだっけ?

ちょっとしたメモ。
1) Fix関数を使用したデータの変更と書き出し。
2) aggregateを使って一気に記述統計をまとめる(新しい練習用シートで)
3) χ二乗検定

カテゴリカルデータの定義付け2 とヒストグラム

前回、性別と人種という二つのカテゴリカルデータを定義づけたので、ちょっともう一度図にしてみる。

s<- read.csv(“yome.csv”,header=T,sep=’,’)
s$sex<-factor(s$sex,levels=0:1,labels=c(“male”,”female”))
s$race<-factor(s$race,levels=0:2,labels=c(“white”,”black”,”yellow”))
plot(s$race,s$weight)

こんな感じで散布図にしてみた。
あらかじめ、性別は、数字ではなくカテゴリカルデータとして扱っているのでplotを使ってもいい感じにしてくれるはず。

f:id:jigawa91:20110507175913j:image

おう!なんかいい感じの図が出来てきた。
この図の形成はこれから考えるとしてと。

どうやって保存するんだろうといろいろいじってみると、

R→ファイル→別名で保存。でできるみたい。

でも。。。
サイズとかいろいろできるみたいだけどまあ今のところはいっか。

そういえば、度数分布表を作っていなかった。
練習用データの中のcutom(習慣)とInhe(遺伝)は5件法のデータなので、ヒストグラムを作る。

これは結構簡単だった。

hist(s$custom,right=FALSE)

これでよし。

f:id:jigawa91:20110507182937j:image

こういうのをひっくるめてfurequency 関数というヤツもあるみたいなのだが、もっと根本的なことが分かってからにしよっと。

たちまち今までの復習。
Rエディタにまとめておいとく。#を使ってメモ。

f:id:jigawa91:20110507182938j:image

とりあえず少しずつだな。

次は、分散分析にチャレンジ!!

カテゴリーデータを定義付け

カテゴリーデータの扱いについてべんきょーしてみる。

ということで、今使っているデータはカテゴリーデータが性別しかないので、ちょっと追加してみた。

f:id:jigawa91:20110507140028j:image

race は人種で。0-white,1-black,2-yellowということにしてみよう。保存してみた。

Rを起動してsを読み込んでみる。

あら、そのままデータは反映されないのね。
本当ならsの次のファイルで読み込んじゃえばいいと思うのだけど。
ちょっといろいろ作りすぎてわけわからんくなってるので一度がっつり消しちゃいましょう。

編集のコンソールの消去とワークスペースの消去をしていったん奇麗にします。

これでsを入れてもでてこない。
f:id:jigawa91:20110507140030j:image

ということで最初から読み込み直し。

s<-read.csv(“yome.csv,header=t,sep=’,’)
s
よし、だいぶ覚えてきたなあ。

f:id:jigawa91:20110507144003j:image

さて、このデータのうち、sexとrace は性別(男、女)と人種(白人、黒人、黄色人種)だから,コイツをうまい事しないと。

ふむふむ。カテゴリーデータの定義付けというヤツが必要。

この定義付けがうまくいけば、分散分析やフループごとの散布図などが出来るらしい。

試行錯誤の結果作ったコマンドがこれ。
性別について定義付けを行う。
> s$sex<-factor(s$sex,levels=0,labels=”male”)
sのデータの変数のsex の0というのは、maleですよ。

というようなコマンド。これでsを見てみる。

f:id:jigawa91:20110507144004j:image

よし、男性はmaleになった。続いて女子もやってみる。
といいたいところだけど、めんどうなので一気にやりたいよね。

っとかなり試行錯誤した結果がこちら

s$sex<-factor(s$sex,levels=0:1,labels=c(“male”,”female”))

f:id:jigawa91:20110507144005j:image
ミソは、0:1 の所。これは0と1ではなく、0から1という感じで捉えるべきみたい。

続いてrace(人種)
s$race<-factor(s$race,levels=0:2,labels=c(“white”,”black”,”yellow”))

sのデータのraceという変数に右辺の式を代入しますよ。
sのデータのraceという変数は、0~2まであって、そのラベルは
white black yellow ですよ。という感じかな。

よーしいってみよう!

f:id:jigawa91:20110507144006j:image

きたーーーーー!!!
ちなみに一口に試行錯誤とは書いてありますが、だいたい2時間くらいはかかってますけどね。

今日のまとめのRエディタ。

f:id:jigawa91:20110507144007j:image

(メモ)
この定義付けは最初にエディタで一気にしたほうがいいと思う。なにがなんやらわからんくなる。

次回はこれを使って、散布図を作成してみよっと。

今までのデータを保存して終了。
そうか、でもyome.Rを持ってれば後からそれをコピペすればいいんだ。