Welcome to
Yamadai. .R #1
        2013/03/18
デモンストレーション
     セッション
      Yamadai.R #1
おしながき
1. Anovakunの使いかた(Rで分散分析)
2. psychパッケージ(Rで因子分析)
3. クラスター分析
4. sem/lavaanパッケージ(RでSEM)
5. MCMCpackパッケージ(Rでベイズ推
   定)
anovakunの使い方
        福屋いずみ
Anovakun
・「R」で動作する分散分析関数

・実験参加者間要因,実験参加者内要因,
  または両方含むタイプの分散分析が可能

・単純主効果の検定
  (一次の交互作用についてのみ)
ANOVA4   on the Web
ANOVA君のファイル入手方法
○井関先生のホームページより
 ANOVA君のファイルから最新のものを保存
http://www11.atpages.jp/~riseki/pukiwikiplus/index.php

         anovakun_432.txt(2013.03.18 現在)
Rstudio   での読み取り方
データ作成
例:3(A)×2(B)の実験参加者内要因
            A1             A2         A3

       B1        B2   B1    B2   B1        B2


 例:3(A)×2(B)の実験参加者間要因
                      B1
             A1
                      B2
                      B1
             A2
                      B2
                      B1
             A3
                      B2
データ作成
例:3(A:実験参加者間)×2(B:実験参加者内)



         A1

         A2   B1   B2

         A3
基本コード
anovakun(データ,”要因計画”,水準,…)

○要因計画
   sを基準に左が実験参加者間要因
   右が実験参加者内要因
   例: “sA” 実験参加者内1要因計画
      “AsB”実験参加者間内2要因混合計画
 ○水準
   要因数に合わせて要因Aの水準から記入
   例:anovakun(data,“AsB”,2,4)
練習問題

    2(実験参加者内)×2(実験参加者内)×3(実験参加者間)
                 い
anovakun(data,         ろ
                           ,   は
                                   ,に   ,     )
     い           ろ         は            に



                 オ 3       ク 1          サ 2
ア     “ABsC”     カ 2       ケ 2          シ 3
イ     “AsBC”     キ 4       コ 3          ス 1
ウ      ABsC
エ      ASBC
基本コード
オプション
効果量
eta・・・「eta = T」とすることで,分散分析表にイータ二乗(eta squared)を追加
peta・・・「peta = T」とすることで,分散分析表に偏イータ二乗(partial eta squared)を追加
geta・・・「geta = T」とすることで,分散分析表に一般化イータ二乗(generalized eta squared)を追加eps・・・
    「eps = T」とすることで,分散分析表にイプシロン二乗(epsilon squared)を追加
peps・・・「peps = T」とすることで,分散分析表に偏イプシロン二乗(partial epsilon squared)を追加
    gpes・・・「gpes = T」とすることで,分散分析表に一般化イプシロン二乗(generalized epsilon
     squared)を追加
omega・・・「omega = T」とすることで,分散分析表に加算モデルに基づくオメガ二乗(omega squared)
      を追加
omegana・・・「omegana = T」とすることで,分散分析表に非加算モデルに基づくオメガ二乗(omega
      squared)を追加
pomega・・・「pomega = T」とすることで,分散分析表に偏オメガ二乗(partial omega squared)を追加
    gomega・・・「gomega = T」とすることで,分散分析表に加算モデルに二基づく一般化オメガ二乗
      (generalized omega squared)を追加
gomegana・・・「gomegana = T」とすることで,分散分析表に非加算モデルに基づく一般化オメガ二乗
      (generalized omega squared)を追加
prep・・・「prep = T」とすることで,分散分析表にp_repを追加

    例:anovakun(data,“AsB”,2,4,eta=T)

                                                      source; 7 〜12行目
多重比較
1.   holm・・・「holm = T」とすることで,Holmの方法(Sequentially Rejective Bonferroni
     Procedure)を指定できます。
2.   hc・・・「hc = T」とすることで,Holland-Copenhaverの方法(Improved Sequentially
     Rejective Bonferroni Test Procedure)を指定できます。
3.   s2r・・・「s2r = T」とすることで,RasmussenのアルゴリズムによるShaffer2の方法を指定で
     きます。
4.   s2d・・・「s2d = T」とすることで,DonoghueのアルゴリズムによるShaffer2の方法を指定で
     きます。
5.   fs1・・・「fs1 = T」とすることで,主効果(単純主効果)の結果を反映させたShaffer1の方法
     を指定できます。
6.   fs2r・・・「fs2r = T」とすることで,主効果(単純主効果)の結果を反映させたShaffer2の方法
     を指定できます(Rasmussenのアルゴリズム)。
7.   fs2d・・・「fs2r = T」とすることで,主効果(単純主効果)の結果を反映させたShaffer2の方法
     を指定できます(Donoghueのアルゴリズム)。
8.   criteria・・・「criteria = T」とすると,多重比較の結果の出力時に,調整済みp値の代わりに調
     整後の有意水準を表示します。
psychパッケージ
      @kosugitti
Basic data analysis

•   Descriptive analysis
•   Simple descriptive graphics
•   Testing correlations
•   Polycoric,Tetrachoric,Polyserial,Biserial correlations

Item and scale analysis

•   Factor analysis
•   Cluster analysis
•   Determining the number of dimensions to extract
•   Reliability analysis

その他

•   IRT analysis
•   Multiple regression
•   Simulation
•   Psychometrics
•   Etc…
記述統計で便利な関数
• describe関数;記述統計を一通り算出します




• summary関数より見やすい




                     source; 14 〜18行目
記述統計で便利な関数
• describeBy関数;群毎にdescribe




                             source; 18行目
記述統計で便利な関数
• corr.test;相関係数の検定までしてくれる




相関係数を出す関数,cor()で
 は係数が出てくるだけ




corr.test()関数は,係数,散
 布ルサイズ,p値を出す


                      source; 20行目
記述統計で便利な関数
• multi.hist関数;
マルチでヒストです。




                  source; 21行目
因子分析に便利な関数
• Rがもっているfactanal関数はちょっと不便
 • 最尤法しかつかえない
 • 回転がPromaxとVarimaxの二種類しかない




• Psychパッケージを使えばすぐに解決!
因子分析に便利な関数

fa.parallel関数;平行
分析による因子数の
決定。
 データと同じサイズの乱
 数行列とスクリープロッ
 トで比較して,意味のあ
 る因子数を提案してくれ
 る。

                   source; 22 〜23行目
因子分析に便利な関数
• 実際の因子分析はfa関数で!
• 様々なオプション
 • nfactors;因子数
 • rotate;回転は直交で varimax, quartimax, bentlerT,
   geominT,斜交でpromax, oblimin, simplimax,
   bentlerQ,geominQ,clusterから選択できます
 • scores;TRUEにすれば因子得点を推定
 • impute;欠損値をmedianかmeanで代入
 • fm;共通性の推定にminres,WLS,GLS,PA,MLから選べ
   ます
因子分析に便利な関数
• 実行例




                共通性(h2)
                 と
                独自性(u2)
                 ※h2=1-u2




        因子負荷量
                source; 24 〜25行目
因子分析に便利な関数
       負荷量,寄与率,累積寄与率




     因子間相関




                  適合度
信頼性係数の算出
• alpha関数;α係数の算出
 o 言わずと知れた内的整合性信頼性係数

• omega関数;ω係数の算出
 o 因子分析結果に基づく信頼性係数。
 o α係数はいわば非常におおざっぱな計算法で
   出されている信頼性の下限なので,ωのよう
   な係数の方がよい,という話も(清水,
   2007)
                   source; 26 〜27行目
信頼性係数の算出
• alpha関数
信頼性の算出
• omega関数



• オプション
     nfactors
     fm
     rotate
omegaSem関数を使うと,CFAに基づくomega係数のほか,
適合度指標も出してくれる
Rでクラスター分析
        @kosugitti
クラスター分析とは
•   数値の近いものを同じグループ(クラスター)に
    まとめる,という手法。

•   手法は大きく分けて二つ。
    o 階層的クラスター
    o 非階層的クラスター

•   いずれもクラスター数は未知で,様々な指標で
    もって事前・事後に定める
階層的クラスター分析
• まとめたクラスターをさらに上位のクラ
 スターにまとめる,というのを繰り返す
クラスタリングの方法
• 距離のルール   • まとめ方のルール
 o ユークリッド距離   o Ward法

 o マンハッタン距離   o 最長距離法

 o ミンコフスキ距離   o 最短距離法

 o マハラヌビス距離   o その他




       実行例
非階層的クラスター分析
o k-means法が有名
     SPSSでは大規模データのクラスタリング,とい
      う名前になっている
     事前にいくつのクラスタにするか決めておく必
      要がある。
     アルゴリズムについては次のアドレスのアニ
      メーションがわかりやすい
  
      http://d.hatena.ne.jp/nitoyon/20090409/kme
      ans_visualise
モデルに基づくクラスタリング
クラスター数の決め方について
•   pvclustパッケージ(階層的)
    o シミュレーションによって出現確率からクラスター数を検定する

•   NbClustパッケージ(階層的)

    o   様々な統計指標を算出してくれる

•   MClust/Model-based HC

    o   モデルに基づいた階層的クラスター分析

•   Xmeans法
                              source; 29 〜52行目a
    o   BIC基準でk-means法を反復的に
自己組織化マップとは
自己組織化マップ(SOM: Self-Organizing Map)
 は、コホネン(T. Kohonen)により提案された
 教師なしのニューラルネットワークアルゴリ
 ズムで、高次元データを2次元平面上へ非線
 形写像するデータ解析方法である。(by金先
 生のページ)
自己組織化マップの特徴
• 任意のサイズの2次元図にデー
    タを分類する

•   分類の基準は類似度

•   カテゴリカルデータはダミー
    変数にして距離を算出する

•   マップのグラデーションから
    傾向を読み取る

•   NNモデルなので数値の一意的
    再現性はないが,強力な分類    source; 55 〜61行目
自己組織化マップの使い方
• とにかく分類したい!というあなたに
• データの全体像を図で見てみたい!という
 あなたに

• とりあえず分類してから,決定木などで分
 類ルールを探す,という使い方も。

• 数量化三類や階層クラスタリングのような
 代数的バックボーンがないので理解しやす
 い=突っ込まれにくい!
RでSEM
        @kosugitti
SEMとは
•   Structural Equation Modelingの略
•   構造方程式モデリングともいう
•   因子分析+回帰分析+α

用語
•   観測変数/潜在変数
•   測定方程式/構造方程式
•   内生変数/外生変数
SEMのモデル図と方程式
• 回帰分析
             a
     b   Y           X




• 因子分析
                         X1   e1


                 F       X2   e2


                         X3   e3
SEMが便利になった理由
• 自由なモデリング
 o いちいち「○○分析」「××分析」の入門をし
  直さなくてよい
• モデルの評価次元の統一
  o 適合度指標によって,モデル全体を一括評価
• グラフィカルなソフトウェアの登場
 o Amosの存在は高く評価しなければならない
 o EQSとかLISRELもがんばってたんだぜ
 o OpenMXという手もあるぜ
Rでだって負けてはいない
• CUIなので見栄えの良さは負けるけど
 o やや慣れも必要だけど
 o 一部GUI出力するようになってきているし
 o そもそもたくさんの測定方程式をGUIで書く
     のはかえってややこしいし
 o   機能はどんどん増えていってるし
 o   分析環境がRの中で統一できるし
 o   無償だし
 o   無償だし
 o   無償だし
Rにおける二大SEMパッケージ
SEMパッケージ                  lavaanパッケージ
• こちらが古株                  •  LAtent VAriables
• 最近になって使いや                  ANalysis
  すさはぐっと増した               •  後発だけに,様々な
• パス図も出力するよ                  便利機能。
• ブートストラップ,               •  ブートストラップ,
  多母集団同時分析に                  多母集団,平均構造
  も対応してるよ                    なんでもござれ。


      source; 65 〜127行目             source; 132 〜144行目

      OpenMXパッケージというのもあるよ
とりあえずやってみよう
いつものirisデータを使って
                                                     花びらの長さ
              顎の長さSepal.Length                                                       e1
                                                     Petal.Length


                                                      花びらの幅
                顎の幅Sepal.Width                                                       e2
                                                      Petal.Length

{sem}                                           {lavaan}
model.a2 <- specifyEquations()                  model.b1 <-'
Petal.Length = path1 * Sepal.Length + path3 *   Petal.Length ~ Sepal.Length+Sepal.Width
Sepal.Width                                     Petal.Width ~ Sepal.Length+Sepal.Width
Petal.Width = path2 * Sepal.Length + path4 *    '
Sepal.Width                                     result.b1 <- cfa(model.b1,data=subiris)
v(Sepal.Length) = v1                            summary(result.b1,fit.measures=T,standardized=T)
v(Sepal.Width) = v2
v(Petal.Length) = v3
v(Petal.Width) = v4

result.a2 <- sem(model.a2,cov(subiris),150)
summary(result.a2)
両者の書式〜{sem}の場合
semパッケージの書式
• specifyModel()を使うとき
    o <-で因果,<>で相関(分散)
    o 変数X <- 変数Y,パス名,初期値/固定母数
•   specifyEquations()を使うとき
    o 変数X = 係数z1 * 変数Y
    o v(変数)=分散
•   出力はsummary
    o 適合度指標はfit.indecesオプションで
    o 標準化係数を出すstandardizedCoefficients()
    o 修正指数を出すmod.indices()
両者の書式〜{lavaan}の場合
• モデルは変数間をつなぐだけ
 o 潜在変数=~観測変数1+2+3+...で測定方程式
 o 変数X~変数Y で構造方程式
 o 変数X~~変数Yで相関関係(共分散)
 o 他にも~1で切片,f1 ~ 0*f2で直交,など。
• 結果はsummary関数で
 o オプションとして
    適合度指標 fit.measure=TRUE
    標準化係数 standardrized=TRUE

• lavaanの方がやや親切かな,と。
応用編;潜在変数をおいたモデル
いつものirisデータを使って

                顎の長さSepal.Length   e1



                 顎の幅Sepal.Width    e2

      F
                   花びらの長さ          e3
                   Petal.Length

                   花びらの幅           e4
                   Petal.Length



     パッケージsemのコードは65〜127行目
    パッケージlavaanのコードは130〜144行目
      です。実際に試してみてください
注意;パッケージによる上書き
• パッケージsemとパッケージlavaanはど
  ちらもsem()という関数を定義しています
• どちらの関数を使うのか,明示してない
    場合は「後で読み込まれた方」が使われ
    ます。
•   対策1;明示する
    o lavaan::sem(),のようにパッケージ名::関数
     名で指定できます
• 対策2;関係ない方を解放する
    o detach(package:lavaan)のように取り外す
Bootstrapについて

                                 ブートストラップ
    母集団
                          復元抽出   ブートストラップ
                 サンプル            サンプル

                                 ブートストラップ
                                 サンプル
                 サンプル
                                 ブートストラップ
                                 サンプル

                                 ブートストラップ
                 サンプル            サンプル
 こっちを集め
 るのが政正統             ・               ・
 派推測統計学             ・               ・
でも真面目にやってないでしょ
                    ・
                 サンプル数N
                                    ・
                                  サンプル数M
        かったるいし
多母集団同時分析
• SEMのおかげで同じモデルを色々なグ
    ループ(サンプル)に当てはめて検証す
    ることが可能に
•   それどころか,一部の係数を等値して検
    証する,という扱い方も!
•   因子負荷量だけが同じとか,分散を等し
    くするとか!
ブートストラップの実装
• ブートストラップをするには
  o semパッケージはbootSem関数
  o lavaanパッケージはbootstrapLavaan関数

• bootSem,bootstrapLavaanのオプションR
  o R=1000で1000個のブートストラップサンプ
    ルを生成
多母集団同時分析の実装
• 多母集団同時分析をするには
 o semパッケージでは,複数のモデルを
  multigroupModel関数でひとつにまとめ,ま
  とめた関数をsem関数で実行する。
     例では全て同じモデルを当てはめているので,
      因子負荷量からなにから完全に同じになる
 o lavaanパッケージではsem関数のオプション
  として指定
     等値制約をかけるときは,制約する係数を
      group.eauql関数で指定
Rでベイズ推定
    @kosugitti
これからはベイジアン
• 学会でこれからの統計業界はベイジアン
 一色になるよ,と言われてそろそろ10年
 o ちなみにその前は「これからの統計業界は
  SEM一色になるよ」と言われていたし,だい
  たいそうなってる
• アプリケーション上での実装が進んでき
  ているので,あながち外れではない
• 心理学業界は検定至上主義思想があるか
 ら,もう少し導入が先になるかも・・・
ベイズを使うと何が嬉しいの?
• ベイズ統計的に考えると
 o χ二乗分布,t分布,F分布など,検定に応じ
  て分布を変えるという必要がない。
     教えやすい,間違えにくい
 o 検定という考え方がそもそもなくなる
    色々な検定を覚える必要がない
    効果量とかも関係ない

 o データだけに基づいて物が言える
    正規分布を仮定できる母集団から完全無作為サ
     ンプリングしてきたもの,とか言い張らなくて
     いい
ベイジアンになるための注意
• あらゆるものを確率変数と考える
 o 回帰係数も,因子負荷量も確率変数
 o たったひとつの推定値(真の値)に近づくと
   いう考え方がない。
 o 推定値も確率変数として,中心化傾向の指標
   と散らばりの指標を伴って報告される
 o 信頼区間Confidence Intervalではなく,信用
   区間Credible Intervalといいあらわす

• 思想が根本から違うと考えた方がいい
ベイズの使われている場所
• スパムメールの学習アルゴリズムとして
 o 技名;ナイーブベイズ(単純ベイズ分類)
 o 実装例;多くのメーラー


• 実例に基づく経験知の積み重ねとして
 o 技名;ベイジアンネット
 o 実装例;病院,警察などいろいろ
ベイズ統計が使われ始めたのは
• やはりコンピュータの演算能力が爆発的
 に発達したから。
 o ブートストラップのように,リサンプリング
   を数千回行っても数秒で終わる
 o ベイズ的推定値を求めるには,分布の形や面
   積が分からなければならないが,そのための
   積分計算が実用的時間の範囲内で行われるよ
   うになった
 o 積分の計算には乱数の発生を必要とするが,
   乱数発生法も進化!(MC法)
頻度主義とベイジアンの思想
• 「究極の魚料理」を求めているとする
• ネイマンピアソン派は,世界各地を回っ
    て様々な料理を食べる。特殊な調理法を
    省いていくと,真の魚料理ができると考
    えている
•   ブートストラップ屋は,一冊の魚料理本
    を最初から最後まで何度も何度も通読し
    ていると,その中に魚料理の王道が現れ
    ると考えている
頻度主義とベイジアンの思想
• ベイジアンは一冊の本を見ながら,自分
    の好きな料理を作り続けていると,ひと
    つの答えにたどり着く。
•   「やっぱり魚は刺身に醤油やで!」


• 変な背理法なんか,もうええやん。。。
で,Rでどうやんの
• ナイーブベイズをするならe1071パッケー
  ジ
• ベイジアンネットをするならdealパッ
  ケージ
• 回帰分析,因子分析などSEMモデルをベ
 イズ推定したいという場合はMCMCpack
 から始めるのが一番
MCMCpackの中身
•   現在ver1.2-4,一部抜粋すると
    o MCMCregress       ...回帰分析
    o MCMCfactanal      ...探索的因子分析
    o MCMCirt1d         ...項目反応理論
    o MCMCirtKd         ...多次元項目反応理論
    o MCMChregress      ...階層線形モデル
    o MCMClogit         ...ロジスティック回帰
    o MCMCordfactanal   ...順序尺度因子分析
    o MCMCpoisson       ...ポワソン回帰
    o MCMCtobit         ...打ち切りデータの解析
MCMCpack関数の共通オプション
• mcmc ... 反復回数
• burnin ... 最初のうちは数値が落ち着か
  ないので,準備期間として捨てる部分
• thin       ... サンプリング間隔。間
  引きに使う
• verbose... 画面に結果を出力する頻度
• seed       ... 乱数の種
オプションとそのイメージ
seed        途中経過を出力するタイミング=verbose




                                        ・・・

                                      推定に使う間引き間隔=thin
       burn in                              推定に使われる範囲

                               mcmc

                 室橋「MCMCにおける収束判定技法の利用」を参考に筆者改変
                 http://www.es99.net/murohashi/filemgmt_data/files/JPAWS08.pdf
mcmcはどれぐらい?
いつまでburn inしたらいいの?
• デフォルトでは
  mcmc=100000,burnin=1000になっている
• 収束したかどうか,を判定する指標
 o Gewekeの指標
 o Gelman&Rubinの指標
 o Heidelberger and Welchの指標
 o Rafty and Lewisの指標
• いずれもcodaパッケージ(MCMCpackが自動的
 に召還)に含まれています
実践してみよう
• 回帰分析MCMCregress
 o 最小二乗法による結果と比較してみよう


• 因子分析MCMCfactanal
 o minres法による結果と比較してみよう




                     source; 146 〜161行目
収束判定の実装
• codaパッケージのcodamenu()関数から,対
  話的に
• gewek.diag関数やraftery.diag関数で直接判断
 指標を呼び出すことも。
 o Gewekeの指標はZ値で出るので,±1.96以内
   に入っていれば収束してないとはいえない
 o Gelman and Rubin,Rafty and Lewisの指標は
   自己相関をもとにしていて1.0に近ければOK
 o Heidelberg and Welchはテスト結果も出ます
ぶっちゃけRだとまだまだ
• MCMCpackは結構頻繁にバージョンアッ
 プしている
 o どんどん機能が追加されています
• それでもやっぱり不便を感じる
 o MCMCfactanalでうまくいったためしがない
 o SEMをまるごとベイズ推定したいよね
• そんなときは,素直にM-plus
• これはRをdisってるのではなくて,Rには
 もっと広い統計の世界があるからいいの
ある有名なお父さんは言いました
なにジョジョ,Rが結局は役に立たない?

ジョジョ,それはRを使い込んでないからだよ


逆に考えるんだ
      「Rでこんなにもできる,
 R(とM-plus)があればできないことはない」
と考えるんだ...
Yamadai.   #1


Enjoy        Life!

Yamadai.Rデモンストレーションセッション