一、判别分析
1.读取数据
setwd("C:\\Users\\91333\\Documents\\semiester5\\MultivariateStatisticalAnalysis\\DiscriminantAnalysis")
rain_data <- read.table(file = "HW1.csv", sep = ",", header = TRUE)
rain_data$Rain <- ifelse(rain_data$Rain == "yes", 1, 0)
2.线性判别
- 交叉验证:由于数据量为20,较小,故选择lda函数的"CV = T",用留一法交叉验证。
- prior参数:为了使得模型的错判率尽量低,建立循环,使参数"prior"遍历不同的值。
error_rate1 <- rep(NA,9)
for (i in 1:9){
rain_modle1 <- lda(formula = Rain ~ .,
data = rain_data,
prior = c(i, 10-i) / 10,
CV = T)
error_rate1[i] <- sum(rain_modle1$class != rain_data$Rain)/nrow(rain_data)
}
error_rate1
[1] 0.55 0.65 0.40 0.40 0.30 0.35 0.50 0.45 0.45
which.min(error_rate1)
[1] 5
由运行结果可以看出,错判率随着i的增大呈二次变化,并且使得错判率最小的i为5,即prior = c(1, 1) / 2
3.二次判别
error_rate2 <- rep(NA,49)
for (i in 1:49){
rain_modle2 <- qda(formula = Rain ~ .,
data = rain_data,
prior = c(i, 50-i) / 50,
CV = T)
error_rate2[i] <- sum(rain_modle2$class != rain_data$Rain)/nrow(rain_data)
}
error_rate2
[1] 0.50 0.50 0.50 0.50 0.50 0.50 0.50 0.45 0.40 0.25 0.25 0.25 0.25 0.25
[15] 0.30 0.30 0.30 0.25 0.20 0.25 0.25 0.35 0.35 0.35 0.35 0.35 0.35 0.35
[29] 0.35 0.35 0.35 0.30 0.30 0.30 0.30 0.30 0.30 0.25 0.30 0.30 0.40 0.35
[43] 0.35 0.40 0.40 0.40 0.40 0.40 0.45
which(error_rate2 =