今回のお題は林の数量化理論です。
非線形なモデリングというシリーズでやってきましたが,ここではそもそも数字ではないものに数字を割り当てる,という意味で「数量化」と呼ばれるモデルを一般に扱います。
ちなみに,これらのモデルは林知己夫という日本の偉大なメトリシャンがつくりあげたモデル群であり,その業績をたたえて名前が冠されています。林先生自身は統計パッケージもなかった時代に,必要に迫られてその都度データに沿ったモデリングを行っただけであり,最初から理論化を考えて作られたわけではありません。
数量化理論には様々なモデルがあり,これらを分類してI類,II類,III類,IV類,V類,VI類,と名付けられています(飽戸弘による)。今振り返って考えてみると,これらのモデルは 名義尺度変数 に対するアプローチであったと言えます。
今回はこれらのうち,I~III類について解説します。
今回は,群馬大学の青木先生のWeb site(http://aoki2.si.gunma-u.ac.jp/R/) を参考にしながら進めます。インターネット環境を整えた上で読み進めてください。
数量化I類は,回帰分析の一種です。その中でも特に,独立変数が名義尺度水準になっているものを指します。 早速やってみましょう。
# データの準備
sample <- read.csv("sample_utf8.csv",head=T,na.strings="*")
sample$gender <- factor(sample$gender,label=c("male","female"))
qt1.dat <- subset(sample,select=c("class","gender"))
# 青木先生の数量化I類のサイトからソースコードを取ってくる。
source("http://aoki2.si.gunma-u.ac.jp/R/src/qt1.R", encoding="euc-jp")
result.qt1 <- qt1(qt1.dat,y=sample$height)
## [1] "class" "gender"
print(result.qt1)
## カテゴリースコア
## class.A 1.11415
## class.B -1.66564
## class.C 0.51773
## gender.male 6.60073
## gender.female -6.60073
## 定数項 151.38350
plot(result.qt1)
plot(result.qt1,which="fitness")
実はこの方法は,lm関数をつかった普通の回帰分析でもできます。 Rの回帰分析は独立変数がカテゴリカルな場合,自動的に,数量化のような数値の割り当てという考え方を応用してくれるのです。
result.lm <- lm(height~gender+class,data=sample)
この時の結果は,例えば性別の場合,最初のラベル(male)を0としたとき,2つ目のラベル(female)が-13.2015である,という表現になっています。数量化のgender.male,gender.femaleのスコアも13.20146(=6.60073-(-6.60073))離れていることを確認して下さい。
数量化の2つ目のモデルも回帰分析の一種ですが,説明される従属変数のほうが名義尺度である場合です。
# データの準備
sample$height.c <- ifelse(sample$height>157,1,
ifelse(sample$height>150,2,3))
sample$height.c <- factor(sample$height.c,label=c("high","mid","short"))
sample$weight.c <- ifelse(sample$weight>70,1,
ifelse(sample$weight>55,2,3))
sample$weight.c <- factor(sample$weight.c,label=c("heavy","fat","light"))
qt2.dat <- subset(sample,select=c("gender","height.c","weight.c"))
# 青木先生の数量化II類のサイトからソースコードを取ってくる。
source("http://aoki2.si.gunma-u.ac.jp/R/src/qt2.R", encoding="euc-jp")
result.qt2 <- qt2(qt2.dat[,2:3],group=qt2.dat[,1])
print(result.qt2)
##
## カテゴリー・スコア
##
## 解1
## height.c.high -1.48357
## height.c.mid -0.28644
## height.c.short 0.88501
## weight.c.heavy -0.02271
## weight.c.fat -0.04466
## weight.c.light 0.04861
plot(result.qt2,which="category.score")
このモデルは判別分析Descriminant Analysisとも呼ばれているものと同じです。
library(MASS)
result.lda <- lda(gender~height+weight,data=sample)
print(result.lda)
## Call:
## lda(gender ~ height + weight, data = sample)
##
## Prior probabilities of groups:
## male female
## 0.5 0.5
##
## Group means:
## height weight
## male 157.9624 61.3864
## female 144.8046 52.2994
##
## Coefficients of linear discriminants:
## LD1
## height -0.18456560
## weight 0.02973659
prediction.lda <- predict(result.lda)
plot(prediction.lda$x,col=sample$gender)
plot(sample$gender,prediction.lda$x)
数量化III類は,回帰分析のような外的な変数を持たず,因子分析のように変数間関係からその構造を明らかにする方法です。 早速やってみましょう。
#データの準備。前回のタイタニックデータ。
data(Titanic)
Titanic
## , , Age = Child, Survived = No
##
## Sex
## Class Male Female
## 1st 0 0
## 2nd 0 0
## 3rd 35 17
## Crew 0 0
##
## , , Age = Adult, Survived = No
##
## Sex
## Class Male Female
## 1st 118 4
## 2nd 154 13
## 3rd 387 89
## Crew 670 3
##
## , , Age = Child, Survived = Yes
##
## Sex
## Class Male Female
## 1st 5 1
## 2nd 11 13
## 3rd 13 14
## Crew 0 0
##
## , , Age = Adult, Survived = Yes
##
## Sex
## Class Male Female
## 1st 57 140
## 2nd 14 80
## 3rd 75 76
## Crew 192 20
tmp <- data.frame(Titanic)
Titanic.df <- data.frame(
Class = rep(tmp$Class, tmp$Freq),
Sex = rep(tmp$Sex, tmp$Freq),
Age = rep(tmp$Age, tmp$Freq),
Survived = rep(tmp$Survived, tmp$Freq)
)
summary(Titanic.df)
## Class Sex Age Survived
## 1st :325 Male :1731 Child: 109 No :1490
## 2nd :285 Female: 470 Adult:2092 Yes: 711
## 3rd :706
## Crew:885
head(Titanic.df)
## Class Sex Age Survived
## 1 3rd Male Child No
## 2 3rd Male Child No
## 3 3rd Male Child No
## 4 3rd Male Child No
## 5 3rd Male Child No
## 6 3rd Male Child No
# 青木先生の数量化III類のサイトからソースコードを取ってくる。
source("http://aoki2.si.gunma-u.ac.jp/R/src/qt3.R", encoding="euc-jp")
# ダミー変数を作るコードも使う
source("http://aoki2.si.gunma-u.ac.jp/R/src/make.dummy.R", encoding="euc-jp")
result.qt3 <- qt3(Titanic.df)
print(result.qt3)
## 解1 解2 解3 解4 解5 解6
## 固有値 0.44508 0.30504 0.25001 0.20504 0.17852 0.11632
## 相関係数 0.66714 0.55231 0.50001 0.45281 0.42251 0.34105
##
## カテゴリースコア
##
## 解1 解2 解3 解4 解5 解6
## Class.1st -1.72668 -2.22959 -1.78000 0.10939 3.45776 -0.01730
## Class.2nd -0.97619 0.45721 4.78409 1.11605 1.07466 -0.66424
## Class.3rd -0.19576 1.93742 -1.31812 1.28287 -0.72882 -0.87405
## Class.Crew 1.10462 -0.87402 0.16455 -1.42298 -1.03447 0.91753
## Sex.Male 0.64092 -0.00439 0.00504 -0.20310 0.32260 -0.72796
## Sex.Female -2.36051 0.01616 -0.01856 0.74801 -1.18813 2.68107
## Age.Child -1.95131 5.32791 0.04765 -6.01163 2.68136 1.11569
## Age.Adult 0.10167 -0.27760 -0.00248 0.31323 -0.13971 -0.05813
## Survived.No 0.76367 0.34444 -0.00750 0.46849 0.58877 0.80044
## Survived.Yes -1.60038 -0.72183 0.01572 -0.98178 -1.23385 -1.67743
plot(result.qt3)
ここでのプロトに見られるように,関係の深い変数同士は近くに,関係の浅い変数は遠くになるように数値が割り振られます。
興味深いことに,これは変数のプロットだけでなくケースのプロットも行います。
plot(result.qt3,which="sample.score")
この方法は,双対尺度法や対応分析と呼ばれる方法と同じものです。
library(MASS)
Titanic.dmy <- make.dummy(Titanic.df)
result.corresp <- corresp(Titanic.dmy,nf=3)
biplot(result.corresp)
これらの手法は,数値化されていないものに数値を割り振るという考え方で分析するものです。 逆に言えば,測定されている(名義尺度水準以上,つまり言語化されている)ものであれば,その構造を見たり,説明に使ったりできるということです。
Merry Christmas!