You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:00:58