1

我一直在对 R 中的主成分分析的结果进行最小判别分析,并且我一直在根据代表返回的累积变化的某个阈值的 PC 的最小数量计算要使用的适当 PC 数量遵循之前一些研究中的方法,重新分类率最高。

我一直在使用循环计算各种累积 PC 数量的重新分类率,但希望将其打印为 RMarkdown 报告的 data.frame。这是我一直在使用的代码。

for (j in 1:21){
  vars<-sum(diag(prop.table(table(
    trainingframe$locus,
    lda(data.frame(trainingframe[-c(1)])[1:j],grouping=trainingframe$locus,CV=TRUE,prior = c(1,1,1)/3)$class))))
  print(data.frame(j,vars))
}

在这段代码trainingframe中是训练数据集,locus是 LDA 感兴趣的分类变量。第一列没有被选中,因为它是轨迹。我无法提供原始数据,但这应该可以在包含许多变量的主要成分以及一些感兴趣的分类变量的任何数据集上进行。

这是我从脚本中得到的结果。

  j     vars
1 1 0.512605
  j      vars
1 2 0.5882353
  j      vars
1 3 0.7058824
  j      vars
1 4 0.6806723
  j      vars
1 5 0.6722689
  j      vars
1 6 0.6638655
  j      vars
1 7 0.6722689
  j      vars
1 8 0.6386555
  j      vars
1 9 0.6470588
   j      vars
1 10 0.6554622
   j      vars
1 11 0.6554622
   j      vars
1 12 0.7226891
   j      vars
1 13 0.7142857
   j      vars
1 14 0.6890756
   j      vars
1 15 0.6806723
   j      vars
1 16 0.6806723
   j      vars
1 17 0.6890756
   j      vars
1 18 0.6554622
   j      vars
1 19 0.6470588

但是,如您所见,打印结果为每个结果打印了许多独立的数据帧,而不是一个包含所有分析结果的数据帧。

我想要制作的是一个如下的data.frame ...

 j      vars
 1 0.5126050
 2 0.5882353
 3 0.7058824
 4 0.6806723
 5 0.6722689
 6 0.6638655
 7 0.6722689
 8 0.6386555
 9 0.6470588
10 0.6554622
11 0.6554622
12 0.7226891
13 0.7142857
14 0.6890756
15 0.6806723
16 0.6806723
17 0.6890756
18 0.6554622
19 0.6470588

我试图找出一种方法来重写上述代码以生成此处显示的最后一个数据帧。

4

1 回答 1

2

我们可以初始化一个数据集,然后rbind代替printing

d1 <- data.frame(j = integer(), vars = numeric())
for (j in 1:21){
  vars<-sum(diag(prop.table(table(
    trainingframe$locus,
    lda(data.frame(trainingframe[-c(1)])[1:j],
               grouping=trainingframe$locus,CV=TRUE,
              prior = c(1,1,1)/3)$class))))
 d1 <- rbind(d1, data.frame(j,vars))
}

或者另一种编写代码的方法是lapply

out <- do.call(rbind, lapply(1:21, function(j) {
      cls <- lda(data.frame(trainingframe[-1])[seq_len(j)],
         grouping = trainingframe$locus, CV = TRUE,
          prior = c(1, 1, 1)/3)$class
       vars <- sum(diag(prop.table(table(trainingframe$locus, cls))))
       data.frame(j, vars)
      }))
于 2021-06-04T00:58:20.203 回答