1

何度も検索した後、私の問題に対する答えが見つかりませんでした。for ループまたは sapply を使用して、pROC パッケージで ROC 曲線を生成したいと考えています。

私のデータベースは次のようになります (26 列と 74 行のみ):

PT Bpt PA mnT1G mnT01
1   1  1   2.3   4.5
1   2  0   1.2   3.2 
2   1  1   5.4   2.1

ROC 曲線を「手動で」作成できます。

plot.new()
roc1 <- roc(cor.datT$PA, cor.datT$mT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, 
            partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
roc2 <- roc(cor.datT$PA, cor.datT$mT01, plot=TRUE, add=TRUE, percent=roc1$percent, col = 'blue')

「自動」の場合、私は試しました:

最初の roc 曲線は常に mnT1G:

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')

他のroc曲線を追加します(data$Imgは、別のデータフレームからのすべての画像名(T1G、T01など)です)。私はそれらがすべて青になることを理解しています:

sapply(unique(data$Img[data$Img != "T1G"]), FUN = function(i) paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue'), simplify = FALSE)

しかし、私はこのエラーが発生します:

roc.default(cor.datT$PA, cor.datT[paste("mn", i, sep = "")] のエラー: 予測子は数値または順序付けされている必要があります。

forループでも同じことが起こります:

for (i in unique(data$Img[data$Img != "T1G"])){
    plot.new()
    rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
    paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue')
}

列を確認したところ、すべて数値です。私のスクリプトのクラスに何か問題があるのでしょうか?

4

2 に答える 2

0

私の他の回答に対するコメントで指摘したように、問題はdata.frame、抽出から具体的に s が得られることです。

ではdata.frame、1 文字で抽出すると が返されますdata.frame。これは?Extract.data.frameに記載されています:

データ フレームは、いくつかのモードでインデックスを作成できます。[ および [[ が単一のベクトル インデックス (x[i] または x[[i]]) と共に使用される場合、データ フレームはリストであるかのようにインデックス付けされます。

そして?Extractを見てください:

再帰的 (リストのような) オブジェクト

[ によるインデックス付けは原子ベクトルに似ており、指定された要素のリストを選択します。

これはテキストからはあまり明白ではありませんが、列をベクトルに抽出するには、2 つの括弧を使用する必要がある[[ため、

class(cor.datT[[paste("mn",i, sep = "")]])

ベクトルである必要があります。

次のコードが実行されます。

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
for (i in unique(data$Img[data$Img != "T1G"])){
    roc(cor.datT$PA, cor.datT[[paste("mn",i, sep = "")]], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue')
}
于 2016-11-11T15:25:00.860 に答える