No.13051 正準判別分析について  【高橋】 2010/07/14(Wed) 16:41

3群以上の判別で青木先生のcandis()を使わせていただきました。
Rのlda()でも実行してみたところ,各変数の判別係数は同じ結果になったのですが定数項が合いません。
Rのpredict()から導出された判別得点から判断したところ,candisで求めた定数項が正しく,ldaの定数項が間違っているようです。
この辺りの情報を何かご存じでしたら教えていただけますでしょうか?

以下にcandisとldaの結果を添付します。
宜しくお願い致します。
【candisの結果】
判別係数

axis 1 axis 2
A 1.17233 2.97222
B -1.08836 -0.39806
constant 1.36086 -0.72632

判別結果

obj$classification
obj$group G1 G3 N
G1 3 1 2
G3 0 3 1
N 0 0 6
$means
grand mean G1 G3 N
A 0.48125 0.65 0.75 0.13333
B 1.76875 1.45 4.05 0.56667

【Rの結果】
Call:
lda(data$Type ~ ., data = train.data)

Prior probabilities of groups:
G1 G3 N
0.375 0.250 0.375

Group means:
A B
G1 0.6500000 1.4500000
G3 0.7500000 4.0500000
N 0.1333333 0.5666667

Coefficients of linear discriminants:
LD1 LD2
A 1.172325 2.9722205
B -1.088364 -0.3980555

(Z<-lda(data$Type~., data=train.data))
X<-apply(Z$means%*%Z$scaling,2,mean)
の結果
LD1 LD2
-1.6017243 0.7141782

No.13053 Re: 正準判別分析について  【青木繁伸】 2010/07/14(Wed) 17:30

定数項は,色々な決め方があります。でも,所詮は定数項ですから,判別には何の影響もありません(というか,定数項に影響されないようにちゃんと判別するだけです)。
二群の判別の場合なら,定数項を調整することにより,判別値が0より大きいか小さいかで判別できるようになるので,そのように定数項を決めることもあります。しかし,0ではなくて,ある値より大きいか小さいかで判定しても同じことですよね。
iris データの 51~151 すなわち,versicolor と virginica の判別を例にして以下に説明しましょう。
> iris2 <- iris[51:150,]
> iris2[,5] <- factor(iris2[,5])
> candis.ans <- candis(iris2[,1:4], iris2[,5])
> candis.ans

判別係数

axis 1
Sepal.Length 0.94312
Sepal.Width 1.47943
Petal.Length -1.84845
Petal.Width -3.28473
constant 4.41899

判別結果

obj$classification
obj$group versicolor virginica
versicolor 48 2
virginica 1 49
> lda.ans <- lda(iris2[,1:4], iris2[,5])
> lda.ans
Call:
lda(iris2[, 1:4], iris2[, 5])

Prior probabilities of groups:
versicolor virginica
0.5 0.5

Group means:
Sepal.Length Sepal.Width Petal.Length Petal.Width
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026

Coefficients of linear discriminants:
LD1
Sepal.Length -0.9431178
Sepal.Width -1.4794287
Petal.Length 1.8484510
Petal.Width 3.2847304

versicolor と verginica の判別値の重心の中点は,
> mean(lda.ans$means %*% lda.ans$scaling)
[1] 4.418986
なので,判別値から前もって 4.418986 を引いておけば,0 より大きいか小さいかで判別できる
それで,-4.418986 が定数項ということになる
判別値が 4.418986 より大きいか小さいかで判別するなら,定数項は不要。

No.13061 Re: 正準判別分析について  【高橋】 2010/07/15(Thu) 10:58

早速ありがとうございます。すみませんがcandisとldaの定数項の値が異なることについてもうひとつ質問させてください。
今回判別分析を行った結果,得られた式は次のようになります。(最初の投稿に添付)

candis (axis1)
Fc = 1.17233 * A + -1.08836 * B + 1.36086

R lda (LD1)
Fl = 1.172325 * A + -1.088364 * B - - 1.6017243

変数A, Bに観測データ(A=0.3, B=0.9)を入れて判別得点を求めると,
Fc = 0.73303
Fl = 0.9738942
となります。

しかしながら,Rのpredict関数で判別得点を求めると
0.733031803
となり,candisの定数項を用いた値が出てきます。

この違いが分からずに悩んでいます。
apply(Z$means%*%Z$scaling,2,mean)で求めた定数項の値とpredict関数で使用する定数項の値は違うということでしょうか?

※二群の判別を行った時も,ldaで求めた式の判別得点とpredictで導出される判別得点が合わず(合うケースもありました)疑問に思っていました。

たびたびすみませんがご教授宜しくお願い致します。

No.13065 Re: 正準判別分析について  【青木繁伸】 2010/07/15(Thu) 11:52

ごめんなさいね。前のコメントは二群判別に限っていましたけど,今やっているのは三群判別なんですね。

lda では定数項は出ないのになあ?と思っていたので余計に勘違いしました。
あなたが計算していたのですね。

定数項を求めるときの計算式は,あなたの計算方法ではなく,(iris データの分析例では)
> colMeans(iris[,1:4])%*%lda.ans$scaling
LD1 LD2
[1,] -2.105106 6.661473
です。平均値は,全平均です。つまり,各群の平均値に対する判別値の平均値ではありません。

プログラムを読むのが一番です。http://aoki2.si.gunma-u.ac.jp/R/candis.htmlの,

const <- as.vector(-grand.means %*% coeff) # 定数項
のところですね。

No.13068 Re: 正準判別分析について  【高橋】 2010/07/15(Thu) 13:57

青木先生

私の計算が間違っていたのですね。
全平均を用いて正確な定数項を求めることができました。
本当にありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 043 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る