ใน R วิธีคำนวณค่า p สำหรับพื้นที่ใต้ ROC


13

ฉันพยายามหาวิธีคำนวณค่า p สำหรับพื้นที่ภายใต้ลักษณะตัวดำเนินการตัวรับ (ROC) ฉันมีตัวแปรต่อเนื่องและผลการทดสอบการวินิจฉัย ฉันต้องการดูว่า AUROC มีนัยสำคัญทางสถิติหรือไม่

ฉันพบแพ็คเกจจำนวนมากที่เกี่ยวข้องกับเส้นโค้ง ROC: pROC, ROCR, caTools, การตรวจสอบ, Epi แต่หลังจากใช้เวลาหลายชั่วโมงในการอ่านเอกสารและการทดสอบฉันไม่สามารถหาวิธีได้ ฉันคิดว่าฉันเพิ่งพลาดไป


1
สิ่งที่อาจหมายถึงพื้นที่ใต้เส้นโค้งที่จะ 'สำคัญ'?
gung - Reinstate Monica

ฉันอยากจะบอกว่าการทดสอบว่าค่า AUC นั้นแตกต่างจาก 0.5
user32530

เส้นโค้ง ROC ของคุณมาจากอะไร? สมมุติว่าคุณต้องการทดสอบสิ่งนั้น (เช่นมีค่า p สำหรับตัวแบบการถดถอยแบบโลจิสติกที่ถ่ายโดยรวม)
gung - Reinstate Monica

ข้อมูลของฉันเป็นเหมือนดังต่อไปนี้ฉันมีการทดสอบมาตรฐานที่ทำให้การจัดกลุ่มมี / ไม่มีโรคและฉันต้องการค้นหาค่า cut-off สำหรับการวัดทางชีวภาพจากตัวอย่างเลือด นอกจากนั้นฉันต้องการพื้นที่ใต้เส้นโค้ง ไม่เลยฉันไม่มีรูปแบบการถดถอย
user32530

ดังนั้นคุณมีการทดสอบบางอย่างที่ทำกับตัวอย่างเลือดที่ดึงมาจากผู้ป่วยซึ่งให้ตัวเลขแก่คุณ และคุณต้องการใช้หมายเลขนั้นเพื่อจำแนกว่าผู้ป่วยมีโรคหรือไม่ ในปัจจุบันคุณมีชุดของตัวเลขจากการทดสอบนี้สำหรับชุดของผู้ป่วยที่คุณรู้สถานะโรคจริงของพวกเขา ถูกต้องหรือไม่
gung - Reinstate Monica

คำตอบ:


12

ในสถานการณ์ของคุณมันจะเป็นการดีที่จะพล็อตกราฟ ROC และคำนวณพื้นที่ใต้เส้นโค้งนั้น แต่สิ่งนี้ควรพิจารณาเป็นส่วนเสริมสำหรับการวิเคราะห์หลักของคุณแทนที่จะเป็นการวิเคราะห์หลัก คุณต้องการสร้างโมเดลการถดถอยแบบโลจิสติกส์แทน

โมเดลการถดถอยโลจิสติกจะมาพร้อมกับการทดสอบโมเดลโดยรวม (ที่จริงแล้วเนื่องจากคุณมีเพียงหนึ่งตัวแปร p-value นั้นจะเหมือนกับ p-value สำหรับตัวแปรผลการทดสอบของคุณ) p-value นั้นคือสิ่งที่คุณเป็นหลังจากนั้น แบบจำลองนี้จะช่วยให้คุณสามารถคำนวณความน่าจะเป็นที่คาดการณ์ไว้ของการสังเกตที่กำลังเป็นโรค ลักษณะการดำเนินงานรับสัญญาณบอกคุณว่ามีความไวและความจำเพาะจะค้าปิดถ้าคุณใช้เกณฑ์ที่แตกต่างกันในการแปลงความน่าจะเป็นที่คาดการณ์การจัดหมวดหมู่เป็นที่คาดการณ์ไว้ เนื่องจากความน่าจะเป็นที่คาดการณ์ไว้จะเป็นหน้าที่ของตัวแปรผลการทดสอบของคุณดังนั้นจึงเป็นการบอกคุณว่าพวกเขาแลกเปลี่ยนกันอย่างไรถ้าคุณใช้ค่าผลการทดสอบที่แตกต่างกันเป็นเกณฑ์ของคุณ


หากคุณไม่คุ้นเคยอย่างมากกับการถดถอยโลจิสติกมีทรัพยากรบางอย่างในอินเทอร์เน็ต (นอกเหนือจากหน้า Wikipedia ที่ลิงก์ด้านบน):


นั่นเป็นความกระจ่างมาก ขอบคุณ! ดังนั้นฉันพอดีกับโมเดลโลจิสติก glm binomial (logit) จากนั้นฉันเปรียบเทียบมันกับโมเดลว่างและการทดสอบนั้นให้ค่า p ที่ฉันกำลังหา
user32530

ใช่ว่าควรทำเพื่อคุณ LR จะทำให้สิ่งอื่น ๆ เป็นไปได้เช่นกัน แต่นั่นอาจเป็นสิ่งที่คุณต้องการ
gung - Reinstate Monica

ดังนั้นรหัสจะเป็นดังนี้ GLM.1 <- glm (กลุ่ม ~ ต่อเนื่องวาร์, ครอบครัว = binomial (logit), สรุปข้อมูล = DiagnosticData) (GLM.1) GLM.2 <- glm (กลุ่ม ~ 1, ตระกูล = binomial (logit), ข้อมูล = DiagnosticData) anova (GLM.2, GLM.1, test = "Chisq")
user32530

summary(GLM.1)ควรให้สิ่งที่คุณต้องการและฉันคิดว่าanova(GLM.1)จะทดสอบกับรุ่น null โดยที่คุณไม่จำเป็นต้องปรับมันให้เหมาะสม แต่วิธีการของคุณจะได้ผลแน่นอน
gung - Reinstate Monica

10

โดยทั่วไปคุณต้องการทดสอบ H0 = "AUC เท่ากับ 0.5"

นี่คือความจริงที่เทียบเท่ากับการพูด H0 = "การกระจายของอันดับในทั้งสองกลุ่มเท่ากัน"

หลังเป็นสมมติฐานว่างของการทดสอบ Mann-Whitney (Wilcoxon) (ดูตัวอย่างGold, 1999 )

กล่าวอีกนัยหนึ่งคุณสามารถใช้การทดสอบ Mann-Whitney-Wilcoxon อย่างปลอดภัยเพื่อตอบคำถามของคุณ (ดูตัวอย่างMason & Graham, 2002 ) นี่คือสิ่งที่แพคเกจการยืนยันที่กล่าวถึงโดย Franck Dernoncourt ทำ


1
เหตุใดจึงเป็นที่สนใจที่จะแสดงว่าการคาดการณ์ไม่ได้สุ่ม ที่ไม่ได้ประเมินประโยชน์
Frank Harrell

1
@FrankHarrell เพราะในหลาย ๆ กรณีการคาดการณ์ของคุณอาจไม่ดีกว่าการสุ่ม - ซึ่งในกรณีนี้ความได้เปรียบที่คุณรายงานไม่มีอยู่จริง แน่นอนว่าการรายงานช่วงความมั่นใจของมาตรการวัดผลประโยชน์ (ความไวและความจำเพาะ) จะมีประโยชน์มากกว่า แต่การทดสอบความแตกต่างระหว่างสองกลุ่มนั้นเป็นเรื่องธรรมดาในวรรณคดีคลินิกอย่างน้อย (และในความเป็นจริงแล้วกลุ่มมักจะไม่แตกต่างกัน) และฉันเห็นผู้ตรวจสอบขอให้เฉพาะเจาะจง
Calimo

นั่นทำให้รู้สึกน้อย IMHO ฉันอยากรู้ว่ามีประโยชน์อะไรบ้างไม่ใช่ว่าจะดีกว่าแค่พลิกเหรียญ
Frank Harrell

ถ้ามันไม่ดีไปกว่าการโยนเหรียญแล้วทำไมคุณต้องทำทุกอย่างให้สำเร็จ? เพียงแค่พลิกเหรียญ
สกอตต์

4

คุณสามารถใช้roc.area ()จากการตรวจสอบแพ็คเกจ:

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)

มันจะกลับมา $p.value [1] 0.0069930071


ขอบคุณมาก แต่ฉันไม่มีค่า c และ d ฉันมีการทดสอบมาตรฐานที่ทำให้การจัดกลุ่มเป็นโดยมี / ไม่มีโรคและฉันต้องการค้นหาค่า cut-off สำหรับการวัดทางชีวภาพจากตัวอย่างเลือด นอกจากนั้นฉันต้องการพื้นที่ใต้เส้นโค้ง ไม่เลยฉันไม่มีปัญหาเลย ฉันมีตัวแปรไบนารี stdtest และตัวแปรทางชีวภาพต่อเนื่อง
user32530

โอ้ตกลงฉันคิดว่าคุณมี d เพราะฉันคิดว่าคุณมีเส้นโค้ง ROC อยู่แล้ว
Franck Dernoncourt

3
มักจะเป็นความผิดพลาดในการค้นหาทางลัดโดยพลการเมื่อความสัมพันธ์ที่แท้จริงกับความน่าจะเป็นของโรคนั้นราบรื่น นอกจากนี้การทดสอบสมมติฐานว่างว่า ROC คือ 0.5 เป็นสมมติฐานที่ค่อนข้างน่าเบื่อ สำหรับการคาดการณ์ส่วนใหญ่คุณใส่ใจว่าการทำนายนั้นดีเพียงใดไม่ว่าจะเป็นการสุ่ม
Frank Harrell

ไม่มีปัญหาและขอบคุณ Frank Demoncourt อาจมีวิธีรับ d
user32530

ในสาขาการแพทย์บางครั้งพวกเขาต้องการจุดตัดเพื่อสร้างการทดสอบการวินิจฉัย กับผู้ที่พวกเขาต้องการค้นหาว่าหัวเรื่องนั้นป่วยหรือไม่ไม่คาดเดาบางสิ่ง บางครั้งพวกเขาจำเป็นต้องลดต้นทุนด้วยการตัดสินใจที่ถูกกว่าเพื่อระบุสถานะของโรค
user32530

0

เส้นโค้งสอง ROC สามารถนำมาเปรียบเทียบใน proc roc.test()ใช้ สิ่งนี้ยังสร้างค่า p นอกจากนี้การใช้roc(..., auc=TRUE, ci=TRUE)จะช่วยให้คุณมีช่วงความเชื่อมั่นที่ต่ำกว่าและสูงกว่าพร้อมกับ AUC ในผลลัพธ์ในขณะที่สร้างวัตถุ ROC ซึ่งอาจเป็นประโยชน์

ต่อไปนี้เป็นโค้ดตัวอย่างที่ใช้งานได้ซึ่งทดสอบว่าไมล์ต่อแกลลอนหรือน้ำหนักของรถยนต์เป็นตัวทำนายที่ดีกว่าของการส่งสัญญาณประเภทนั้นที่มาพร้อมกับ (อัตโนมัติหรือด้วยตนเอง):

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

น้ำหนักเป็นตัวทำนายที่ดีกว่าการใช้เชื้อเพลิงอย่างเห็นได้ชัด อย่างไรก็ตามนี่เป็นการเปรียบเทียบสองเส้นโค้งและไม่ใช่เส้นโค้งเดี่ยวกับตัวเลขเช่น 0.5 ดูช่วงความมั่นใจเพื่อดูว่ามันมีหมายเลข 0.5 บอกเราหรือไม่ว่ามันแตกต่างกันอย่างมีนัยสำคัญหรือไม่ แต่ไม่ได้สร้างค่า p


มันให้ค่า p ด้วยหรือไม่
Michael R. Chernick

แม้ว่าคำถามจะถูกถามโดยเฉพาะในแง่ของ R นโยบายทั่วไปของเราที่นี่คือเราเป็นเว็บไซต์สถิติ (การเรียนรู้ของเครื่อง ฯลฯ ) ดังนั้นจึงเป็นสิ่งจำเป็นสำหรับ Q ที่จะมีเนื้อหาทางสถิติ & เป็นที่ต้องการอย่างยิ่งว่าเนื่องจากไม่ได้มีให้เฉพาะในข้อกำหนดเฉพาะของซอฟต์แวร์ ในกรณีดังกล่าวคุณสามารถพูดเพิ่มเติมเกี่ยวกับการทดสอบนี้ว่ามันทำงานอย่างไรและมีอะไรมากกว่าแค่พูดถึงว่ามันมีอยู่ใน R & แสดงรหัส R สำหรับมันหรือไม่?
gung - Reinstate Monica

ตกลงฉันจะอัปเดตคำตอบของฉันเพื่อสะท้อนภูมิหลังทางสถิติบางอย่าง
naco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.