R'de, ROC altındaki alan için p-değeri nasıl hesaplanır


13

Bir alıcı operatör özelliği (ROC) altındaki alanın p değerini hesaplamanın bir yolunu bulmak için mücadele ediyorum. Sürekli bir değişkenim ve bir tanısal test sonucum var. AUROC'un istatistiksel olarak anlamlı olup olmadığını görmek istiyorum.

ROC eğrileri ile ilgili birçok paket buldum: pROC, ROCR, caTools, doğrulama, Epi. Ancak belgeleme ve testleri okumak için saatler geçirdikten sonra bile nasıl olduğunu bulamadım. Bence sadece özledim.


1
Eğri altındaki alanın 'anlamlı' olması ne anlama geliyor olabilir?
gung - Monica'yı eski durumuna getirin

AUC değerinin 0,5'ten istatistiksel olarak farklı olup olmadığını test etmek istedim
user32530

ROC eğrisinden ne geldi? Muhtemelen bunun bir testini istiyorsunuz (örneğin, bir bütün olarak alınan bir lojistik regresyon modeli için bir p değeri vardır).
gung - Monica'yı eski durumuna getirin

Verilerim şu şekildedir, gruplandırmayı hastalıklı / hastalıksız hale getiren standart bir testim var ve bir kan örneğinden biyolojik bir belirleme için bir kesme değeri bulmak istiyorum. Bunun yanında eğrinin altındaki alana ihtiyacım var. Yani hayır, herhangi bir regresyon modelim yok
user32530

Böylece, bir hastadan alınan kan örneğinde yapılan ve size bir sayı veren bazı testleriniz var; ve hastanın hastalığa sahip olup olmadığını sınıflandırmak için bu sayıyı kullanmak isteyeceksiniz. Şu anda, gerçek hastalık durumunu bildiğiniz bir grup hasta için bu testten bir dizi numaranız var. Bunların hepsi doğru mu?
gung - Monica'yı eski durumuna getirin

Yanıtlar:


12

Sizin durumunuzda, bir ROC eğrisini çizmek ve o eğrinin altındaki alanı hesaplamak iyi olacaktır, ancak bu , birincil analizin kendisinden ziyade ana analizinize ek olarak düşünülmelidir . Bunun yerine, lojistik regresyon modeline uymak istiyorsunuz .

Lojistik regresyon modeli, modelin bir bütün olarak test edilmesiyle standart olarak gelecektir. (Aslında, yalnızca bir değişkeniniz olduğundan, bu p değeri, test sonucu değişkeniniz için p değeriyle aynı olacaktır.) Bu p değeri, peşinde olduğunuz değerdir. Model, hastalıklı bir gözlemin tahmini olasılığını hesaplamanıza izin verecektir. Bir Alıcının Çalışma Karakteristiği , tahmin edilen olasılığı öngörülen bir sınıflandırmaya dönüştürmek için farklı eşikler kullanırsanız , hassasiyet ve özgüllüğün nasıl değişeceğini söyler . Tahmin edilen olasılık test sonucu değişkeninizin bir işlevi olacağından, eşik olarak farklı test sonucu değerleri kullanırsanız nasıl işlem yaptıkları da açıklanmaktadır.


Lojistik regresyona çok aşina değilseniz, internette bazı kaynaklar vardır (yukarıda bağlantılı Wikipedia sayfasının yanı sıra):


Bu çok aydınlatıcıydı. Teşekkür ederim! Bu yüzden bir lojistik model glm binomial (logit) takıyorum. Sonra null bir model ile karşılaştırmak ve bu test bana aradığım p değerini verir?
user32530

Evet, bunu sizin için yapmalı. LR de birçok şeyi mümkün kılacak, ancak ihtiyacınız olan her şey bu olabilir.
gung - Monica'yı eski durumuna getirin

Yani kod aşağıdaki gibi olurdu? GLM.1 <- glm (Grup ~ continuVar, aile = binom (logit), veri = diagnostikVeri) özeti (GLM.1) GLM.2 <- glm (Grup ~ 1, aile = binom (logit), veri = teşhisVeri) anova (GLM.2, GLM.1, test = "Chisq")
user32530

summary(GLM.1)size ihtiyacınız olanı vermeli ve bence anova(GLM.1)bunu aslında uyması gereken sıfır modele göre test edecektir. Ama senin yolun kesinlikle işe yarayacak, evet.
gung - Monica'yı eski durumuna getirin

10

Temel olarak H0 = "AUC 0,5'e eşittir" test etmek istiyorsunuz.

Bu aslında H0 = "İki gruptaki rütbelerin dağılımı eşittir" demekle eşdeğerdir.

İkincisi Mann-Whitney (Wilcoxon) testinin sıfır hipotezidir (bakınız örneğin Gold, 1999 ).

Başka bir deyişle, sorunuzu cevaplamak için Mann-Whitney-Wilcoxon testini güvenle kullanabilirsiniz (bkz. Örneğin Mason & Graham, 2002 ). Franck Dernoncourt tarafından belirtilen doğrulama paketi tam olarak bunu yapar.


1
Tahminlerin rastgele olmadığını göstermek neden ilgi çekici olabilir? Bu yararlılığı değerlendirmez.
Frank Harrell

1
@FrankHarrell Çünkü birçok durumda tahminleriniz rastgele olmaktan daha iyi olmayabilir - bu durumda bildirdiğiniz fayda aslında sıfırdır. Elbette, yararlılık önlemlerinin (duyarlılık ve özgüllük) güven aralığını bildirmek daha yararlı olacaktır. Ancak iki grup arasındaki farkı test etmek klinik literatürde en azından yaygındır (ve aslında gruplar genellikle farklı değildir) ve gözden geçirenlerin özellikle bunu talep ettiğini gördüm.
Calimo

IMHO çok az mantıklı. Madeni para çevirmekten daha iyi olup olmadığını değil, bir şeyin ne kadar yararlı olduğunu bilmek istiyorum.
Frank Harrell

Bir bozuk parayı çevirmekten daha iyi değilse, neden tüm bu işleri yapasın ki? Sadece bozuk parayı çevir.
Scott

4

Paket doğrulamasından roc.area () öğesini kullanabilirsiniz :

install.packages("verification")
library("verification")

# Data used from Mason and Graham (2002).
a<- c(1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990,
 1991, 1992, 1993, 1994, 1995)
d<- c(.928,.576, .008, .944, .832, .816, .136, .584, .032, .016, .28, .024, 0, .984, .952)

A<- data.frame(a,d)
names(A)<- c("year", "p2")

# For model without ties
roc.area(A$event, A$p2)

Geri dönecek $p.value [1] 0.0069930071


Çok teşekkür ederim, ama c ve d değerim yok. Gruplandırmayı hastalıklı / hastalıksız hale getiren standart bir testim var ve bir kan örneğinden biyolojik bir belirleme için bir kesme değeri bulmak istiyorum. Bunun yanında eğrinin altındaki alana ihtiyacım var. Yani hayır, hiçbir gerilemem yok. Ben stdtest ikili değişken ve biyolojik değer sürekli değişken var
user32530

oh tamam zaten bir ROC eğrisine sahip olduğunu düşündüğüm için d olduğunu düşündüm.
Franck Dernoncourt

3
Hastalık olasılığı ile gerçek ilişki pürüzsüz olduğunda genellikle keyfi bir kesim aramak bir hatadır. Ayrıca, ROC alanının 0.5 olduğu sıfır hipotezinin test edilmesi oldukça sıkıcı bir hipotezdir. Çoğu tahmin için tahminin rastgele olup olmadığını değil, ne kadar iyi olduğunu umursarsınız.
Frank Harrell

Sorun değil, ve teşekkürler Frank Demoncourt, belki de d almanın bir yolu var.
user32530

Tıp alanında bazen tanı testleri oluşturmak için bu kesme noktalarına ihtiyaç duyarlar. Bunlarla konunun hasta olup olmadığını bulmak istiyorlar, bir şey tahmin etmiyorlar. Bazen hastalık durumunu tanımlamak için daha ucuz bir kararlılıkla maliyetleri azaltmaları gerekir.
user32530

0

İki ROC eğrisi pROC kullanılarak karşılaştırılabilir roc.test(). Bu aynı zamanda bir p değeri üretir. Ayrıca,roc(..., auc=TRUE, ci=TRUE) ROC nesnesini oluştururken, yararlı olabilecek ROC nesnesini oluştururken çıkıştaki AUC ile birlikte daha düşük ve daha yüksek güven aralıkları verir.

Aşağıda, galon başına milin veya bir arabanın ağırlığının, donatılmış olduğu şanzıman türünün (otomatik veya manuel) daha iyi bir tahmincisi olup olmadığını test eden çalışan örnek kodu verilmiştir:

library(pROC)
roc_object_1 <- roc(mtcars$am, mtcars$mpg, auc=T, ci=T) #gives AUC and CI
roc_object_2 <- roc(mtcars$am, mtcars$wt, auc=T, ci=T) #gives AUC and CI

roc.test(roc_object_1, roc_object_2) #gives p-value

Ağırlık, yakıt tüketiminden çok daha iyi bir yordayıcıdır. Ancak bu, 0.5 gibi bir sayı ile tek bir eğriyi değil, iki eğriyi karşılaştırmaktadır. 0,5 sayısını içerip içermediğini görmek için güven aralığına baktığımızda, bize önemli ölçüde farklı olup olmadığını söyler, ancak bir p değeri üretmez.


P-değerini de sağlıyor mu?
Michael R. Chernick

Her ne kadar soru özellikle R açısından sorulsa da, buradaki genel politikamız bir istatistik (makine öğrenimi, vb.) Soru-Cevap sitesi olduğumuzdur . Bu nedenle, bir Q'nun istatistiksel içeriğe sahip olması gereklidir ve As'nin yalnızca yazılıma özgü terimlerle sunulmaması şiddetle tercih edilir. Bunun ışığında, bu testin ne olduğu ve nasıl çalıştığı hakkında daha fazla şey söyleyebilir misiniz, sadece R'de var olduğunu ve R kodunu gösterdiğini söylemenin ötesinde?
gung - Monica'yı eski durumuna getirin

Tamam, cevabımı bazı istatistiksel arka planı yansıtacak şekilde güncelleyeceğim
naco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.