2016-12-04 1 views
0

enter image description here更新:今は機能していますが、他の方法の仕組みについてはまだ理解していません。ベクトルでこれを計算するには?

cuts <- seq(from=3, to=36, by=0.01) 

    for (i in cuts) { 
     cut_off<- i 
     set.seed(666) 
     samp_h <-rnorm(1000,mean=12,sd=3) 
     samp_d <-rnorm(1000,mean=18,sd=6) 
     a <- sum(samp_h <= cut_off) 
     c <- sum(samp_h > cut_off) 
     b <- sum(samp_d <= cut_off) 
     d <- sum(samp_d > cut_off) 
     sens <- a/(a+c) 
     spci <- d/(d+b) 
     assign(paste("ss",as.character(cut_off),sep = ""), sens) 
     assign(paste("sp",as.character(cut_off),sep = ""), spci)} 

    ss_v<- unlist(
     lapply(    
     paste0("ss",cuts), 
     get)    
    ) 

    sp_v<- unlist(
     lapply(    
     paste0("sp",cuts), 
     get)    
    ) 

    plot(1-sp_v, ss_v) 

こんにちはすべて: 私は違う得るために異なる 'cut_off' を使用しようとしていたが 'SENS'(敏感)と 'SPCI'(spcificity)。上記のコードの問題は、34 'カット'のために、私は結果を得ることができるということです。しかし、私はカットを変更する場合:

cuts <- seq(from=3, to=36, by=0.01) 

このメソッドは結果を返すことはできません。問題は、各ベクトルの数を計算するので、ベクトルを使って "ss_v"と "ss_p"を直接計算する方法を尋ねています。どうもありがとうございました。

バックグラウンド情報: 「健康な」患者では、抗体レベルが正常(12,32)に分布し、「病気」患者では抗体が正常(18,62)に分布しているとします。これらは「構成された」数字であり、現実的なものではないことに注意してください。 Rの「rnorm」機能を使用して、多数の病気のある健康な患者(例えば、それぞれ1000人)の抗体数をシミュレートします.15のカットオフを選択した場合の感度と特異度はどうなりますか? 3と36の間のカットオフ範囲(3,3.01,3.02、...、35.98,35.99,36など)の感度と特異度を記録します。ヒント:Rの 'seq'関数を使用してカットオフを生成し、 'for'ループまたはベクトル化された計算を使用して感度と特異度を計算します。 x軸に「1特異性」、y軸に「感度」をプロットします。

+0

だからではなく、それらを別々に分析すること、あなたは真実 『と『抗体数を表す値』「を含む*グループ』と2000行を持つ2つの列オブジェクトを作成することができます。私が使って考えます偏りの分布はより生物的である可能性があります。log-normalまたはgammaのランダム変数を使用するかどうかにかかわらず、 'table'関数を適切に使うためにpostiionになります。 –

答えて

0

あなたのコードは、マクロ言語としてRを使用しようとしている例です。 Rベクトルを正しく使う方法を学ぶ方がいいでしょう。 for -loopを使用しているので、sensspciを事前に割り当てて、sensspciをインデックス付きベクトルとして割り当てる必要があります。 (だから私は結果のベクトルがあなたの要求に合っていることを支持しています。)次に、ワークスペースに個々の切断された名前付きオブジェクトが散在するのではなく、ベクトル名を付けます。

cuts <- seq(from=3, to=36, by=1) 
sens <- numeric(length(cuts)); spci=numeric(length(cuts)) 
for (i in cuts) { 
    cut_off<- i 
    set.seed(666) 
    samp_h <-rnorm(1000,mean=12,sd=3) 
    samp_d <-rnorm(1000,mean=18,sd=6) 
    hth <- table(samp_h) 
    dis <-table(samp_d) 
    a<-length(hth[names(hth) <= cut_off]) 
    c<-length(hth[names(hth) > cut_off]) 
    b <-length(dis[names(dis) <= cut_off]) 
    d <-length(dis[names(dis) > cut_off]) 
    sens[i] <- a/(a+c) 
    spci[1] <- d/(d+b) 
} 
names(sens) <- paste0("ss",cuts) 
names(spci) <- paste0("sp",cuts) 

は、私はすべてのループの繰り返しで新しいシミュレートされたデータセットに取り組んでの概念は本当に、その効率で私を感動とは思わないが、あなたは差分で何かをシミュレートする場合、それは次のようになります。代わりにこれを試してみてください。 sensspciを感度と特異性として正しく構築しているかどうかは確かではありませんが、少なくとも結果はどのように見えるかわかります。 ROCカーブを構築するいくつかのパッケージがあります。

> sens 
    ss3 ss4 ss5 ss6 ss7 ss8 ss9 ss10 ss11 ss12 ss13 
0.000 0.000 0.745 0.747 0.752 0.764 0.792 0.836 0.895 0.000 0.123 
ss14 ss15 ss16 ss17 ss18 ss19 ss20 ss21 ss22 ss23 ss24 
0.239 0.374 0.485 0.593 0.661 0.700 0.721 0.736 0.744 0.745 0.745 
ss25 ss26 ss27 ss28 ss29 ss30 ss31 ss32 ss33 ss34 ss35 
0.745 0.745 0.745 0.745 0.745 0.745 0.745 0.747 0.747 0.747 0.747 
ss36 <NA> <NA> 
0.747 0.747 0.747 

それはちょうど私が期待する感度の結果のようには見えません。

これは私がループの中にあなたのアルゴリズムが正しいことは疑問だ理由です。私はabcd <-table(samp_h >= cut_off, samp_d >= cutoff)のようなコードを使って、a、b、c、dの値を生成しているかもしれません。次に、そのテーブルの結果で行列インデックスを使用できます。 、そうspci results.`(私が持っていたので、インデックスが間違っていない

a <- sum(samp_h <= cut_off) 
    c <- sum(samp_h > cut_off) 
    b <- sum(samp_d <= cut_off) 
    d <- sum(samp_d > cut_off) 

sens -itivity結果が今より賢明なように見えますが、:別のオプションあなたのテーブルの努力をスキップして、このコードブロックを使用するかもしれません以下のコードで修正されました。)

cuts <- seq(from=3, to=36, by=1) 
sens <- numeric(length(cuts)); spci=numeric(length(cuts)) 
    set.seed(666) 
    samp_h <-rnorm(1000,mean=12,sd=3) 
    samp_d <-rnorm(1000,mean=18,sd=6) 
#Only need to make the test data.frame once 
dfrm <- data.frame(vals = c(samp_h, samp_d), 
        grp = c(rep("H", 1000), rep("D",1000))) 

for (i in seq_along(cuts)) { 
    cut_off<- i 

    abcd <- with(dfrm, 
    table(Test_res = vals > cut_off, 
      status=grp)) 
    sens[i] <- abcd["TRUE","D"]/sum(abcd[, "D"]) 
    spci[i] <- abcd["FALSE", "H"]/sum(abcd[, "H"]) 
} 
names(sens) <- paste0("ss",cuts) 
names(spci) <- paste0("sp",cuts) 

plot( 1-spci, sens, type="b") 
text(1-spci[c(TRUE,FALSE,FALSE,FALSE,FALSE)]+.05, 
     # hack to print every 5th cutoff value 
     sens[c(TRUE,FALSE,FALSE,FALSE,FALSE)], 
     label=(3:36)[ c(TRUE,FALSE,FALSE,FALSE,FALSE)]) 

enter image description here

+0

ありがとうございます。実際に2年のSASプログラマーがいるので、Rを使うことは本当に私を迷惑にさせてしまいます。私はいつもSASからRに似た何かをしようとしていますので、とても気分が悪くなります。以下に詳細を追加してください。 – Tom

+0

こんにちは、プロフェッサー。私はこの練習の詳細を追加します。どうもありがとうございました。私はあなたが求めているものを与えると思います。 – Tom

+0

コードに問題があります。 SS3、SS4 SS5、SS6、SS7 SS8 SS9 SS10 SS11 SS12 SS13 0.000 0.000 0.745 0.747 0.752 0.764 0.792 0.836 0.895 0.000 0.123 SS14 SS15 SS16 SS17 SS18 SS19 SS20 SS21 SS22 SS23 SS24 0.239 0.374 0.485 0.593 0.661 0.700 0.721 0.736 0.744 0.745の結果について0.745 SS25 SS26 ss27 ss28 ss29 SS30 SS31 SS32 SS33 SS34 SS35 0.745 0.745 0.745 0.745 0.745 0.745 0.745 0.747 0.747 0.747 0.747 ss36 0.747 0.747 0.747、SS3は、0.745の代わりに0 Iでなければならないので、私は、3から開始するので – Tom

関連する問題