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

ただし、ご覧のとおり、印刷された結果は、すべての分析の結果を含む 1 つのデータ フレームではなく、結果ごとに多数の独立したデータ フレームを印刷します。

私が作りたいのは、次のような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

データセットを初期化してから、 ingrbindの代わりにprint

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 に答える