多元统计分析:判别分析

简介

步骤

1. Fisher 判别(线性判别)

1
2
3
4
5
6
7
fd4 <- lda(G~x1+x2+x3+x4, d4_uni);fd4
print('------------------------------------')
predict(fd4)$class # 预测结果
print('------------------------------------')
ftab4 <- table(predict(fd4)$class, d4_uni$G);ftab4 # 判别矩阵
print('------------------------------------')
sum(diag(ftab4))/sum(ftab4) # 判对率

2. 非线性判别

1
2
3
4
qd4 <- qda(G~x1+x2+x3+x4,d4_uni)    # 注意: 非线性判别使用 qda(),线性判别使用 lda()
qtab4 <- table(predict(qd4)$class, d4_uni$G);qtab4 # 判别矩阵
print('------------------------------------')
sum(diag(qtab4))/sum(qtab4) # 判对率

3. Bayes 判别

1
2
3
4
5
bd4 <- lda(G~x1+x2+x3+x4,d4_uni,prior=c(1,1)/2);bd4
print('------------------------------------')
btab4 <- table(predict(bd4)$class, d4_uni$G);btab4 # 判别矩阵
print('------------------------------------')
sum(diag(btab4))/sum(btab4) # 判对率

PS: Bayes 判别 也使用 lda() 函数,但需要给出先验概率。

在进行 Bayes判别时,假定各类协方差阵相同,此时判别函数为线性。

先验概率 相等的 Bayes判别模型 ,此时判别函数类似于 Fisher 线性判别函数

4. 预测

1
2
3
predict(fd4, newdata=data.frame(x1=78.3563,x2=0.8895,x3=1.8001,x4=14.1022))$class
predict(qd4, newdata=data.frame(x1=78.3563,x2=0.8895,x3=1.8001,x4=14.1022))$class
predict(bd4, newdata=data.frame(x1=78.3563,x2=0.8895,x3=1.8001,x4=14.1022))$class

案例

企业财务状况的判别分析

1
2
3
library(openxlsx)

Case6 = read.xlsx("../Res/mvcase5.xlsx", 'Case6');Case6
1
plot(Case6[,2:5], gap = 0)
1
2
3
4
library(MASS)

ld = lda(G~., data = Case6);ld # 线性判别
plot(ld)
1
2
3
Zld = predict(ld);Zld

data.frame(Case6$G, Zld$class, round(Zld$x, 3))
1
tab1 = table(Case6$G, Zld$class);tab1
1
sum(diag(tab1)) / sum(tab1)
1
addmargins(tab1)
1
qd = qda(G~., data = Case6);qd # 二次判别
1
Zqd = predict(qd);Zqd # 预测
1
data.frame(Case6$G, Zqd$class, round(Zqd$post, 3) * 100)
1
tab2 = table(Case6$G, Zqd$class);tab2 # 判对阵
1
sum(diag(tab2)) / sum(tab2) # 判对率
1
addmargins(tab2)

Q&A

补充

参考