猫も杓子も構造化

発達障害、特別支援などについて書いています。最近は心理学関係の内容が多めです。

備忘録:Ubuntuに最新のRを

普通にapt install r-baseだと今だとRの3.4が手に入るが、パッケージによってはもっと新しいバージョンを求められるのでインストールすることにした。

qiita.com

このサイトを参考にしたが、公開鍵の取得の際にproxyに阻まれて少しはまった。次のサイトを参考に--keyserver-optionというのでproxyを指定してやるとうまくいった。

qiita.com

これでRの3.6が手に入った。

備忘録:ターミナルの見た目変更

気分転換にターミナルを色々と変えてみる。

まず色合いを変える。次のサイトを参考に有名どころでsolarizedにした。

reasonable-code.com

その中でlsコマンドのエイリアスを.bashrcに書き込むのだけれど、デフォルトでは.bashrcは自動読み込みしないので以下を参考に.bash_profileに起動時の自動読み込みについて書いた。

blog.ruedap.com

次に、フォントもこの際にRictyに変更する。

qiita.com

であれこれ調べている間にbashからzshに乗り換えとかしてみる

qiita.com

ついでにRstudioもテーマを変えてみる。 Preference >> Appearanceで好きなテーマを選べば良い。

f:id:nekomosyakushimo:20190531210915p:plain

重み付き最小二乗法についての調べ物

SEMなどの際の推定法の中にWeighted Least Square(重み付き最小2乗法)というものがある。通常の(重みをつけない)最小2乗法は標本共分散行列とモデルの共分散行列の残差が最も小さくなるようにモデルの母数を推定するが, WLSでは残差に対して異なる重みを与える。

Weighted Least Squareとは

SEMのオプションで一般にWLSというとBrown(1984)によるAsymptotically Distribution-Free法のことを指すようで, 分布によらない推定ができるらしい。データとモデルの不一致度の関数は次のように表される。

\displaystyle
F(\boldsymbol{S, \Sigma}) = (\boldsymbol{s - \sigma})' \boldsymbol{W}^{-1} (\boldsymbol{s-\sigma})

ここで, \boldsymbol{s}は標本共分散行列の対角要素を含む下三角要素を縦ベクトルにしたもので\boldsymbol{\sigma}は, 同じ操作をモデルの共分散行列にしたものである。 \boldsymbol{W}が重みの行列である。

重みの行列はサイズが, 観測変数の数をpとしたときに p(p+1)/2 \times p(p+1)/2になる。例えば観測変数が2個だとしたら 3 \times 3の行列でそれぞれの成分は次のようになる。

\displaystyle
\begin{pmatrix}
w_{11,11} & &sym \\\
w_{21,11} & w_{21,21} &  \\\
w_{22,11} & w_{22,21} & w_{22,22}
\end{pmatrix}

ここで, w_{ij,kl}は標本数をN, 観測変数をxとしたときに次のようになる。

\displaystyle
w_{ij,kl} = s_{ij,kl} - s_{ij} s_{il} \\
s_{ij,kl} = \frac{1}{N-1} \Sigma (x_{in} - \bar{x_i})(x_{jn} - \bar{x_j})(x_{kn} - \bar{x_k})(x_{ln} - \bar{x_l})

である。

lavaanで試してみる

具体的な数字を入れてみると分かりやすいだろうということでみんな大好きlavaanで試してみる。まず, データの変数の部分だけ取り出してモデルを指定。

library(lavaan)
dat <- HolzingerSwineford1939[,7:15]

model1 <- "
visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9
"

推定法にestimator="WLS"とつけるとlavaanはWLSでやってくれる。

res.wls <- cfa(model=model1, data=dat, estimator="WLS")
summary(res.wls)

f:id:nekomosyakushimo:20190511234844p:plain

さて, このモデルで重み行列はどこに保存されているかというとres.wls@SampleStats@NACOVというところにある。9変数あるので45×45の行列である。

f:id:nekomosyakushimo:20190511234850p:plain

表示しきれていないだけで, 下にまだまだ続いている。

さて, 実際にさっきの計算式通りに計算して確かめてみよう。たとえば w_{21,11}を計算してみる。lavaanでは, N-1でなくNで計算しているようなので出力結果に合うように300/301をかけている。

W <- res.wls@SampleStats@NACOV[[1]] # lavaanの出力結果のW
mean <- res.wls@SampleStats@mean[[1]] # 標本の各変数の平均
s <- res.wls@SampleStats@cov[[1]] # 標本の分散共分散行列


s_2111 <- mean((dat[,2]- mean[2])*(dat[,1] -mean[1])^3)
W_2111 <- s_2111 - (s[1,1]*300/301 * s[2,1]*300/301)

f:id:nekomosyakushimo:20190511234904p:plain

とこんな感じで計算した結果が \boldsymbol{W}に入っている。これの逆行列を使って重みづけた残差の2乗和が最小になるように推定を行うのがWLSであるようだ。

参考にしたもの

共分散構造分析 疑問編―構造方程式モデリング (統計ライブラリー)

共分散構造分析 疑問編―構造方程式モデリング (統計ライブラリー)

ポリコリック相関係数のお勉強

ポリコリック相関係数とは, 2つの順序付きのカテゴリー変数の間に2変量正規分布を仮定して母相関を最尤推定する方法である。Olsson(1979)の方法が有名である。Rのパッケージでも計算できるがお勉強ついでに自作してみる。解説はこの論文を参考にした。 https://www.ncbi.nlm.nih.gov/pubmed/15598100

データの準備

とりあえず順序つきのカテゴリー変数を作ってみる。2変量正規分布で乱数を生成してそれを離散化する。カテゴリー数は変数1は3, 変数2は4あたりにしてみる。

library(mvtnorm)
set.seed(1)
sigma <- matrix(c(1,0.5,0.5,1),2)
dat <- rmvnorm(100, mean=c(0,0), sigma=sigma)

cat1 <- cut(dat[,1], breaks=c(-Inf,-1,1,Inf), label=F)
cat2 <- cut(dat[,2], breaks=c(-Inf,-1,0,1,Inf), label=F)
cont.table <- table(cat1,cat2)

こんな感じの分割表が手に入る。

f:id:nekomosyakushimo:20190504011544p:plain

cor(dat) #0.5053
cor(cat1,cat2) #0.4049

カテゴリー変数になることにより相関係数が低くなっていることが分かる。

ポリコリック相関のやることはこの分割表から離散化前の相関係数を推定することである。

ステップ1 閾値の推定

Olsson(1979)の方法ではポリコリック相関係数を2つのステップで推定する。最初のステップは閾値の推定である。周辺確率を使って次のように定める。

\displaystyle
a_i = \Phi^{-1}_1(P_{i \cdot})

ここで a_i, 0...s閾値である。同様に,

\displaystyle
b_j = \Phi^{-1}_1(P_{\cdot j})

 b_j, 0...rはもう片方の変数の閾値である。

rではこんな感じでやると閾値が出る。後に使うので前後に-InfとInfを加えている。

# 閾値推定
marg.freq1 <- prop.table(rowSums(cont.table))
marg.freq2 <- prop.table(colSums(cont.table))

tau1 <- c(-Inf,qnorm(cumsum(marg.freq1)[-length(marg.freq1)]),Inf)
tau2 <- c(-Inf,qnorm(cumsum(marg.freq2)[-length(marg.freq2)]),Inf)

f:id:nekomosyakushimo:20190504012039p:plain

こんな感じで閾値が手に入る。

ステップ2 母相関の推定

さて, いま手に入れた閾値と分割表を使って母相関係数最尤推定する。尤度は次のように求める。

\displaystyle
l = \ln K + \sum_1^{S} \sum_1^{J} n_{ij} \ln \pi_{ij}

ここで, Kは定数, n_{ij}は分割表のセルの度数であり,  pi_{ij}は変数がcell(i,j)に入る確率である。この確率というのは2変量正規分布を仮定すると,

\displaystyle
\pi_{ij} = \Phi_2(a_i, b_j) - \Phi_2(a_{i-1}, b_j) - \Phi_2(a_{i}, b_{j-1}) + \Phi_2(a_{i-1}, b_{j-1})

で計算できる。ここで\Phi_2\rhoをパラメータに持つ2変量累積密度関数である。

Rでこれを計算する。mvtnormというパッケージのpmvnormはセルの範囲を指定すれば確率を計算してくれる。さっき作った閾値で範囲を指定しながら全セル分計算するようにしている。ここでぼは例えば母相関0.3の場合を計算してみる。

  pi <- numeric(length(cont.table))
  pi <- matrix(pi, length(marg.freq1), length(marg.freq2))
  for(ite.cat1 in 1:length(marg.freq1)){
    for(ite.cat2 in 1:length(marg.freq2)){
      pi[ite.cat1, ite.cat2] <- pmvnorm(mean=c(0,0),sigma=matrix(c(1,0.3,0.3,1),2),
                                    lower=c(tau1[ite.cat1], tau2[ite.cat2]),
                                    upper=c(tau1[ite.cat1+1],tau2[ite.cat2+1]))[1]
      }
  }

そうするとこんな感じで各セルの確率が出てくる。

f:id:nekomosyakushimo:20190504011617p:plain

で次は, 式にしたがってその確率の対数をとって度数をかけて合計する。

logL <- sum(cont.table * log(pi))
logL
#[1] -201.9102

これで母相関が0.3だとした場合の尤度が出てきた訳だ。定数はパラメータ変えようが関係ないから無視して大丈夫。あとは, 母相関を変えながら尤度が最も高くなる母相関を探せば良いので, 今までのものを次のようにループに組み込む。-0.99から0.99までを0.01刻みで動かしながら尤度を計算していく。

rho <- seq(-0.99,0.99, by=0.01)
logL <- numeric(length(rho))

for(ite.rho in 1:length(rho)){

  pi <- numeric(length(cont.table))
  pi <- matrix(pi, length(marg.freq1), length(marg.freq2))
  for(ite.cat1 in 1:length(marg.freq1)){
    for(ite.cat2 in 1:length(marg.freq2)){
      pi[ite.cat1, ite.cat2] <- pmvnorm(mean=c(0,0),sigma=matrix(c(1,rho[ite.rho],rho[ite.rho],1),2),
                                    lower=c(tau1[ite.cat1], tau2[ite.cat2]),
                                    upper=c(tau1[ite.cat1+1],tau2[ite.cat2+1]))[1]
      }
  }

  logL[ite.rho]<- sum(cont.table * log(pi))
}

#もっとも尤度が高い母相関は
rho[which.max(logL)]
#[1] 0.52

計算の結果, 母相関は0.52が最も尤もらしい値だということになった。

試しに、polycorパッケージのpolychorで計算してみる。

polychor(cat1,cat2)
#[1] 0.5165662

ほぼ同じ値を推定していることが分かる。母相関の区切れを細かくすればこの値に近づくだろう。 という訳で、ポリコリック相関係数を自作するお話でした。

読書メモ:マーカス・ボルスブーム著『テスト妥当性理論のフロンティア』

Frontiers of Test Validity Theory (Multivariate Applications Series)

Frontiers of Test Validity Theory (Multivariate Applications Series)

これを読んでいる。

理解していない点や誤読している部分も多いと思うが、主に自分のための記録を一応残しておく。

Chapter 1: Introduction

1.1 Terminology

本で使われる用語の説明。

1.1.1 Testing, Assesing, and Measureing

  • Measuring:少なくとも間隔尺度水準以上で量やマグニチュードとして測定すること。
  • Assesing, Testing:互換的に用いる。Testingの方は体系的な観察に重点を置く一方、asseesmentの方は採点に重点を置く。

1.1.2 Attributes, Constructs, and Latent Variables

この本ではこれらの用語はテストされる実際のプロパティを指す。理論語(theoretical terms)、ラベル、記号は指さない。

  • Constructs:このプロパティの実質的な解釈を想定。
  • Latent variables:潜在変数が表しているプロパティを特定せずに,内容に依存しない統計モデルと確率的な関係を捉えることが可能。
  • Construct label: 構成概念に与えられたラベル。

1.1.3. Items, Indicators, and Indices

  • Items:テスト受検者からの反応を誘発することを目的に、テストに組み込まれた個別の刺激。受検者の項目への反応は項目への反応(item response)。
  • Item score:項目への反応を[正解=1・誤答=0]のようにコーディングしたもの。コーディングする行為はitem scoring。
  • Indicators:潜在変数との関係を想定したモデルにおいての項目。項目得点はindicator scores.
  • Index:測定モデルと等式が逆転。項目への反応の要約として合成得点にする場合。

1.1.4. Test Validity and Validation

  • Validity:この本ではtest validityを指す。(research designの内的妥当性・外的妥当性のような広い意味での妥当性ではない)
  • Validation:テストの妥当性を調査し記述する過程を指す。

1.2 The development of Test Validity theory

  • Cureton(1950) :記述的経験主義と一貫した方法で。心理学における行動主義と科学哲学における実証主義を反映。観察語として操作化されないと無意味。測定しようとしたものとテストが測定しているものを重視。
  • Cronbach(1971):探索的(論理的)経験主義に発展。推定される理論変数が観察されたテストの行動を説明するという考え。観察されたテストの行動を一般的な科学法則に包含することを含む。
  • Messick(1989):constructivist realism。理論の過小評価は妥当性理論で以前から言われており、同じデータでも理論が違えば違ったように要約する。Realistパートは全く新しい。心理学的構成概念は、人々の間にある変動のリアルな次元を反映した実際に存在しているプロパティであることを強調。
  • Kane(2006):哲学的プラグマティズム。妥当性をユニバーサルな性質なものでなく、文脈に高度に依存した性質のものととして扱う。validationも当然文脈依存(ある文脈では十分妥当でも別の文脈では妥当にあらず)。

1.2.1 Descriptive Empiricism

  • 1896年Pearson相関係数を考案。テスト得点にすぐに応用される。このときはテストの妥当性は「測定したいものを測定できているか」。相関係数はその指標で広くvalidity coefficientと呼ばれた。他の変数との相関がテストの妥当化の主たる道具。
  • 基準となる測定がなされる前の予測によく使われた(例:高校の成績を大学での成功を予測する指標に)。また、テストの経済的な短縮版を作ったときにもとのテストと相関するかにも使われた。
  • 教育テストの文脈では内容を詳細に検討することが予測よりも好まれた。
  • これらの文脈から基準関連妥当性(criterion-related validity)と内容妥当性(content validity)の区別が出てくる。前者はテストと基準との相関を証拠に、後者は専門家による評価が証拠として扱われた。

1.2.2 Explanatory Empiricism

  • 上記2つの妥当性だけだと扱えない問題が増えてきたところにCronbach & Meehl(1955)が構成概念妥当性を提案。
  • 測定したもの操作化の代わりに, 理論によって予測される他の観察されたもののネットワークとの関係の観点で測定したものを表現することを提案。
  • ここまでの3つの妥当性が教育・心理テストのスタンダード(1985)の基盤に。
  • これら3つの妥当性以外には例えばCampbell & Fiske(1959)の収束的妥当性(convergent validity)や弁別的妥当性(discriminant validity)など。さらに収束的妥当性をtrait validityとnomological validityに分解したり、弁別的妥当性を基準関連妥当性の形で言及されたり、感度と特異度の文脈で使われたり。 基準妥当性(criterion validity)は併存的妥当性と予測的妥当性の2つからなるものとして整理された(違いはデータ収集の時期)。
  • その他にも次のようなものも:
    • Incremental validity:回帰モデルで予測力を向上させる程度
    • Ecological validity:ある状況における妥当性が別の状況でも妥当か
    • Population validity:テスト被験者の集団を変えても妥当か
    • Synthetic validity:テストバッテリーの妥当性
    • Face validity:テストが測定するよう意図されたものを測定しているように被験者からみて見えるか

これらを統合しようという試みもあったが、Messick(1989)までは本格的な統合はなされず。

1.2.3 Constructivist realism

  • 「観察」が理論を発展させる基本の要素となる経験主義から実在論の見方へ
  • Constructivist realism: 科学研究で用いられる概念を、実在する実体への近似として捉え、それらは科学的実践や応用的な実践のを通じて構成されるという立場。
  • Messickは妥当性理論をunifiedと考えたがunitaryと考えなかった。理論のレベルでは多くの証拠を包含するようになったからunified。しかし、証拠の種類や理屈の部分で多様性があったためunitaryではない。

1.2.4 Pragmatism

  • Interpretive argument(解釈的論証)が鍵となる概念。これにより妥当化はより動的にコミュニケーションや対話と結びついたものに。
  • 妥当性を、無時間の普遍的なものから、特定の時間や場所でなされる文脈依存の論証にした。
  • Kane(2006)による解釈の4要素:
    • テストへの反応の採点
    • テストへの反応の領域への一般化
    • テストへの反応をこえた推定
    • テスト得点に基づく意思決定
  • 解釈には証拠が必要。証拠には、テスト得点そのもの、代わりの説明の不在、

1.3 Measurement, Causation, Meaning, and Test Validity

この本の著者らがとる立場。3つの鍵となる概念。

1.3.1 Measurement and Test Validity

  • 間隔尺度以上の水準としている以上、Measurementは多くのテストが理想として渇望しているものとが、ほとんどのテストが到達することができていないもの。
  • しかし, Measurementの概念はテストが作成される方法、テスト得点が解釈される方法、テストが妥当化される方法を形作る

1.3.2 Causation and Test Validity

  • 「構成概念の値がテスト得点の値を引き起こすのか」という問い。
  • 記述的経験主義的にはnever。なぜならconstructはデータの中のパターンだから。
  • 潜在変数モデルは自然に因果関係を想定。

1.3.3 Meaning and Test Validity

  • テスト理論は今までテスト得点の意味や解釈についてあまり雄弁でない(テスト開発者やユーザーに比べて)
  • この原因はnumber peopleとwords peopleの興味の差

UbuntuにPsychopyを入れる話

自分のためのメモ。UbuntuにPsychopyを入れたときの記録。

UbuntuへのPsychopyのインストール

公式サイトにある通りターミナルを開いて以下のコマンドで一発。

sudo apt install psychopy

これだけで無事に入る。超かんたん。

ちなみにPsychopy3は入らないのかと色々やってみたけれど、トラブルに見舞われて結局できなかったうえに, aptからインストールしようとしても動かないPsychopy3しか入らない事態に落ちいった。最終的には色々削除してから以下のようにバージョン指定で入れることで落ち着いた。

# インストール可能なバージョンを見る
sudo apt-cache showpkg psychopy

# バージョン指定でpsychopyをインストール
sudo apt install psychopy=1.85.3.dfsg-1build1

参考