【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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る