修复LDA误分类率存储循环:生成多PC对应结果的R代码问题
问题修复:PCA+LDA循环遍历主成分数量并记录结果
错误原因
你的循环仅执行一次,因为for (i in k)中k是单个数值(比如10),循环只会迭代这一个值。要遍历1到k的所有整数,需改成for (i in 1:k)。
修复后的完整代码
# required packages library(MASS) library(class) library(tidyverse) # reading in and cleaning data og_data <- read.csv("data.csv") og_data <- og_data[, -1] og_data$tumour <- unclass(as.factor(og_data$tumour)) # standardizing st_data <- as.data.frame(cbind(og_data[, 1], scale(og_data[, -1]))) colnames(st_data)[1] <- "tumour" # PCA for dimension reduction k <- 10 # 要遍历的主成分数量上限 grouping <- c(rep(1, 62), rep(2, 42)) # 真实类别向量 pca <- prcomp(st_data[, -1]) # 初始化结果数据框 df_misclassification <- tibble( num_pcs = as.numeric(), class_1_accuracy = as.numeric(), class_2_accuracy = as.numeric() ) # 修正循环:遍历1到k的每个主成分数量 for (i in 1:k){ # 提取前i个主成分 pca_subset <- as.data.frame(pca$x[, 1:i]) # 带交叉验证的LDA lda_result <- lda(pca_subset, grouping = grouping, CV = TRUE) # 生成混淆矩阵 conf_mat <- table(predicted = lda_result$class, observed = grouping) # 计算每类的分类正确率(注:你原代码的命名是误分类率,但实际计算的是正确率) class_accuracy <- diag(conf_mat) / rowSums(conf_mat) # 添加结果到数据框 df_misclassification <- df_misclassification %>% add_row( num_pcs = i, class_1_accuracy = class_accuracy[1], class_2_accuracy = class_accuracy[2] ) } # 查看结果 df_misclassification
额外说明
- 原代码中变量命名
misclassification_rate和实际计算的分类正确率(正确分类样本数/该类总样本数)不符,建议修正命名避免混淆;如果确实需要误分类率,只需改成1 - diag(conf_mat)/rowSums(conf_mat)即可。 - 循环变量改为
1:k后,会遍历每个主成分数量,最终数据框会生成k行对应结果。 - 优化了变量命名(如
a→pca_subset,b→lda_result),提升代码可读性。
内容的提问来源于stack exchange,提问作者wantingtoimprove
相关产品推荐
相关产品推荐

