จากความไวสู่ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ: ค่าทำนายผลบวก ความชุก และเศรษฐศาสตร์ของการคัดกรอง

On this page
Read the English version
บทคัดย่อ
Sensitivity และ specificity อธิบายสมรรถนะของการตรวจภายในกลุ่มที่มีและไม่มีโรค ส่วน predictive values อธิบายว่าผลบวกและผลลบหมายถึงอะไรในประชากรที่รับการตรวจ ค่าเหล่านี้เปลี่ยนตามความชุก แม้ sensitivity และ specificity จะคงเดิม บทความนี้คำนวณตัวอย่างเพื่อการเรียนรู้จาก HITAP Basic course, Day 1, Lecture 3 ใหม่ โดย positive predictive value ลดจาก 50.0% ในการศึกษาเหลือ 4.1% เมื่อสมมติความชุกสำหรับการคัดกรองเป็น 2% แต่ accuracy กลับสูงขึ้นเพราะผู้รับการตรวจส่วนใหญ่ไม่มีโรคเป้าหมาย ผังจำนวนคนแสดงว่าใครต้องตรวจยืนยันและใครยังตรวจไม่พบ ต้นทุนการตรวจและการยืนยันที่ใช้เป็น illustrative inputs ให้ต้นทุนประมาณ 75,600 THB ต่อผู้ป่วยจริงที่ตรวจพบ เมื่อใช้จำนวนคนที่ปัดแล้ว เราแยกต้นทุนของผลลัพธ์ระหว่างทางนี้ออกจากสุขภาพที่ดีขึ้น การตัดสินใจคัดกรองยังต้องมีหลักฐานเรื่องการรักษาเร็วขึ้น ผลเสียจากผลบวกลวง ผู้ป่วยที่พลาดการตรวจพบ และการตรวจซ้ำ สุดท้ายเชื่อมเกณฑ์ผลตรวจกับประโยชน์สุทธิทางคลินิกและมูลค่าทางเศรษฐศาสตร์ โดยยังต้องตรวจสอบสมรรถนะในพื้นที่ก่อนนำเครื่องมือ AI ไปใช้
Accuracy เปลี่ยนตามตัวหาร
Accuracy คือสัดส่วนผู้ที่การตรวจจำแนกได้ถูกต้อง True positives (TP) คือผู้มีโรคและผลบวก ส่วน true negatives (TN) คือผู้ไม่มีโรคและผลลบ False positives (FP) และ false negatives (FN) คือข้อผิดพลาดในทิศทางที่สอดคล้องกัน
ให้ $Se$ แทน sensitivity, $Sp$ แทน specificity และ $\pi$ แทนความชุกในประชากรที่รับการตรวจ Sensitivity มีเงื่อนไขว่ามีโรค ส่วน specificity มีเงื่อนไขว่าไม่มีโรค Accuracy รวมทั้งสองกลุ่มโดยถ่วงตามความชุก
$$Acc=Se\pi+Sp(1-\pi)$$
เมื่อ specificity สูงกว่า sensitivity ความชุกที่ลดลงอาจเพิ่ม accuracy โดยการตรวจไม่ได้ดีขึ้น ควรแสดงจำนวนคนและค่าที่มีเงื่อนไขทั้งสองเสมอ ต้องกำหนดประชากรที่เป็นตัวหารก่อนเปรียบเทียบโครงการ
Predictive values ตอบคำถามของผู้รับการตรวจ
Positive predictive value (PPV) หรือค่าทำนายผลบวก คือความน่าจะเป็นที่จะมีโรคเมื่อผลตรวจเป็นบวก Negative predictive value (NPV) หรือค่าทำนายผลลบ คือความน่าจะเป็นที่จะไม่มีโรคเมื่อผลตรวจเป็นลบ Predictive values เหล่านี้กลับด้านเงื่อนไขที่ใช้กับ sensitivity และ specificity
$$PPV=\frac{Se\pi}{Se\pi+(1-Sp)(1-\pi)}$$
$$NPV=\frac{Sp(1-\pi)}{Sp(1-\pi)+(1-Se)\pi}$$
เมื่อความชุกต่ำ ผู้ไม่มีโรคจำนวนมากยังอาจให้ผลบวกได้ จึงต้องมีเส้นทางตรวจยืนยันผลบวกที่ชัดเจน NPV ที่สูงเพียงอย่างเดียวอาจสะท้อนว่าโรคพบน้อย มากกว่าสมรรถนะที่ดีของการตรวจ
ใช้ likelihood ratios ปรับ odds
Likelihood ratio (LR) คืออัตราส่วนที่ใช้คูณ odds ของการมีโรคหลังทราบผลตรวจ ผลบวกและผลลบใช้อัตราส่วนต่างกัน เริ่มจาก odds $\pi/(1-\pi)$ แล้วแปลง odds หลังตรวจกลับเป็นความน่าจะเป็น
$$LR^+=\frac{Se}{1-Sp}$$
$$LR^-=\frac{1-Se}{Sp}$$
$$O_{post}=O_{pre}LR$$
$$p_{post}=\frac{O_{post}}{1+O_{post}}$$
ค่าตัวอย่างจากหลักสูตรให้ $LR^+=2.07$ และ $LR^-=0.76$ ซึ่งเปลี่ยน odds ได้จำกัด การเปลี่ยนแปลงนี้จะทำให้เลือกดำเนินการต่างไปหรือไม่ ขึ้นกับความน่าจะเป็นเริ่มต้นและเกณฑ์ตัดสินใจ
จากตารางในหลักสูตรสู่งบคัดกรอง
แหล่งที่มา: HITAP Basic course, Day 1, Lecture 3 เอกสารตรวจสอบตัวเลขที่ได้รับระบุว่าเป็นตัวอย่าง AI คัดกรองภาวะซึมเศร้า จำนวนคนเป็นค่าตัวอย่างจากหลักสูตร ส่วนความชุกในประชากรและราคาด้านล่างเป็น illustrative inputs
ตัวอย่างนี้เป็นการคัดกรองครั้งเดียวและนับเฉพาะต้นทุนการตรวจและการยืนยัน Verify: เลขหน้าสไลด์ต้นฉบับ บริบทการรับผู้เข้าร่วม และปีราคาก่อนนำไปใช้นอกการเรียนรู้
-
สร้างกลุ่มในการศึกษากลับจากจำนวนคน
\[ Se=22/58,\quad Sp=98/120 \]
ค่าตัวอย่างที่อ้างอิงจากหลักสูตรมี TP 22, FN 36, FP 22 และ TN 98 ผู้มีโรคมี 58 จาก 178 คน จึงมีความชุก 32.6% ผู้ไม่มีโรคมี 120 คน ผลบวกมี 44 คน และผลลบมี 134 คน
-
คำนวณสมรรถนะในการศึกษา
\[ PPV=22/(22+22) \]
Accuracy เท่ากับ 67.4%, PPV เท่ากับ 50.0% และ NPV เท่ากับ 73.1% Positive LR เท่ากับ 2.07 และ negative LR เท่ากับ 0.76 เก็บเศษส่วนเดิมไว้สำหรับขั้นถัดไป
-
นำการตรวจไปใช้กับประชากรสมมติ
\[ TP=200\times 22/58\approx 76 \]
คัดกรอง 10,000 คน โดยสมมติความชุกเป็น 2% จึงมีผู้มีโรค 200 คน และผู้ไม่มีโรค 9,800 คน คูณแต่ละกลุ่มด้วยความน่าจะเป็นแบบมีเงื่อนไขของผลตรวจเพื่อหาจำนวนคาดหมาย เมื่อปัดเป็นจำนวนคนจะได้ TP 76, FN 124, FP 1,797 และ TN 8,003
-
คำนวณความหมายของผลตรวจใหม่
ที่ความชุกสำหรับการคัดกรอง PPV เป็น 4.1%, NPV เป็น 98.5% และ accuracy เป็น 80.8% ร้อยละเหล่านี้ใช้จำนวนคาดหมายที่ยังไม่ปัด Accuracy ที่สูงขึ้นจึงเกิดพร้อมกับโอกาสที่ผลบวกจะเป็นโรคจริงที่ต่ำลงมาก
-
รวมต้นทุนคัดกรองและตรวจยืนยัน
\[ C=Nc_{test}+(TP+FP)c_{confirm} \]
สมมติต้นทุนการตรวจเป็น 200 THB ต่อคน และการยืนยันเป็น 2,000 THB ต่อผลบวก สมมติว่าผลบวกทุกคนเข้ารับการยืนยันและการยืนยันจำแนกโรคได้ถูกต้อง จำนวนที่ปัดแล้วให้ผลบวก 1,873 คน และต้นทุนยืนยัน 3,746,000 THB เมื่อรวมต้นทุนคัดกรอง 2,000,000 THB จะได้ 5,746,000 THB หรือประมาณ 5.75 ล้าน THB
-
หารด้วยผู้ป่วยจริงและแยกเงินที่ใช้กับผลบวกลวง
\[ C_{case}=C/TP \]
หารด้วยผู้ป่วยจริง 76 คน ได้ 75,605.26 THB ต่อคน หรือประมาณ 75,600 THB การยืนยันผลบวกลวงมีต้นทุน 3,594,000 THB คิดเป็น 62.5% ของงบนี้ สัดส่วนดังกล่าวนับเฉพาะต้นทุนยืนยันผลบวกลวง โดยไม่ได้ปันต้นทุนคัดกรองให้กลุ่มนี้
ผลลัพธ์: ตัวอย่างที่ใช้จำนวนคนปัดแล้วให้ 5.75 ล้าน THB ประมาณ 75,600 THB ต่อผู้ป่วยจริง และ 62.5% สำหรับยืนยันผลบวกลวง
วิธีปัดจำนวนมีผล: หากคงจำนวนคาดหมายที่เป็นเศษส่วนตลอดการคำนวณ จะได้ประมาณ 75,700 THB ต่อผู้ป่วยจริง ทั้งสองวิธียังไม่รวมต้นทุนรักษาและไม่ได้แสดงประโยชน์ต่อสุขภาพ
คำนวณจำนวนคน ต้นทุน และเส้นโค้งซ้ำ
# Writes: none (stdout only). HITAP Basic course, Day 1, Lecture 3 counts; prevalence and costs are illustrative.
a <- c(TP=22,FN=36,FP=22,TN=98); n <- sum(a); se <- unname(a[1]/sum(a[1:2])); sp <- unname(a[4]/sum(a[3:4]))
emit <- function(x,d=0,u="") for(i in seq_along(x)) cat(names(x)[i],": ",formatC(x[i],format="f",digits=d),u,"\n",sep="")
pv <- function(p,s=se,t=sp) c(PPV=s*p/(s*p+(1-t)*(1-p)),NPV=t*(1-p)/(t*(1-p)+(1-s)*p)); ps <- sum(a[1:2])/n
emit(c(a,Study_N=n,Disease=sum(a[1:2]),No_disease=sum(a[3:4]),Positive=sum(a[c(1,3)]),Negative=sum(a[c(2,4)]))); emit(100*c(Prevalence=ps,Accuracy=sum(a[c(1,4)])/n,pv(ps)),1,"%"); emit(c(LR_positive=se/(1-sp),LR_negative=(1-se)/sp),2)
N <- 10000; p <- .02; x <- c(TP=N*p*se,FN=N*p*(1-se),FP=N*(1-p)*(1-sp),TN=N*(1-p)*sp); r <- round(x)
emit(c(Screen_N=N,Disease=N*p,No_disease=N*(1-p),r,Positive=sum(r[c(1,3)]))); emit(c(Screen_prevalence=100*p),0,"%"); emit(100*c(pv(p),Accuracy=sum(x[c(1,4)])/N),1,"%")
ct <- 200; cc <- 2000; total <- N*ct+sum(r[c(1,3)])*cc; exact <- N*ct+sum(x[c(1,3)])*cc
emit(c(Test_THB=ct,Confirmation_THB=cc,Screening_THB=N*ct,Confirmation_THB=sum(r[c(1,3)])*cc,Total_THB=total,False_positive_THB=r[3]*cc)); emit(c(Total_million_THB=total/1e6),2)
emit(c(Cost_per_TP_THB=total/r[1]),2); emit(c(Cost_per_TP_nearest100=round(total/r[1],-2),Unrounded_model_per_TP_nearest100=round(exact/x[1],-2))); emit(c(False_positive_budget_share=100*r[3]*cc/total),1,"%")
z <- qnorm(.975); ci <- function(k,m) ((k/m+z^2/(2*m))+c(-1,1)*z*sqrt((k/m)*(1-k/m)/m+z^2/(4*m^2)))/(1+z^2/m)
emit(c(Confidence=95),0,"%"); emit(c(Se=se,Se_low=ci(a[1],sum(a[1:2]))[1],Se_high=ci(a[1],sum(a[1:2]))[2],Sp=sp,Sp_low=ci(a[4],sum(a[3:4]))[1],Sp_high=ci(a[4],sum(a[3:4]))[2]),4)
grid <- sort(unique(c(seq(0,.4,by=.01),p,ps))); for(q in grid) cat(sprintf("Plot prevalence=%.8f%% PPV=%.8f%% NPV=%.8f%%\n",100*q,100*pv(q,round(se,2),round(sp,2))[1],100*pv(q,round(se,2),round(sp,2))[2]))
emit(c(Plot_Se=round(se,2),Plot_Sp=round(sp,2)),2); emit(setNames(seq(0,40,10),paste0("Prevalence_axis_",seq(0,40,10))),0,"%"); emit(setNames(seq(0,100,25),paste0("Predictive_axis_",seq(0,100,25))),0,"%")
stopifnot(sum(r)==N,all(r==c(76,124,1797,8003)),total==5746000,round(total/r[1],-2)==75600)
> a <- c(TP = 22, FN = 36, FP = 22, TN = 98)
> n <- sum(a)
> se <- unname(a[1]/sum(a[1:2]))
> sp <- unname(a[4]/sum(a[3:4]))
> emit <- function(x, d = 0, u = "") for (i in seq_along(x)) cat(names(x)[i],
+ ": ", formatC(x[i], format = "f", digits = d), u, "\n", sep = "")
> pv <- function(p, s = se, t = sp) c(PPV = s * p/(s *
+ p + (1 - t) * (1 - p)), NPV = t * (1 - p)/(t * (1 - p) +
+ (1 - s) * p))
> ps <- sum(a[1:2])/n
> emit(c(a, Study_N = n, Disease = sum(a[1:2]), No_disease = sum(a[3:4]),
+ Positive = sum(a[c(1, 3)]), Negative = sum(a[c(2, 4)])))
TP: 22
FN: 36
FP: 22
TN: 98
Study_N: 178
Disease: 58
No_disease: 120
Positive: 44
Negative: 134
> emit(100 * c(Prevalence = ps, Accuracy = sum(a[c(1,
+ 4)])/n, pv(ps)), 1, "%")
Prevalence: 32.6%
Accuracy: 67.4%
PPV: 50.0%
NPV: 73.1%
> emit(c(LR_positive = se/(1 - sp), LR_negative = (1 -
+ se)/sp), 2)
LR_positive: 2.07
LR_negative: 0.76
> N <- 10000
> p <- 0.02
> x <- c(TP = N * p * se, FN = N * p * (1 - se), FP = N *
+ (1 - p) * (1 - sp), TN = N * (1 - p) * sp)
> r <- round(x)
> emit(c(Screen_N = N, Disease = N * p, No_disease = N *
+ (1 - p), r, Positive = sum(r[c(1, 3)])))
Screen_N: 10000
Disease: 200
No_disease: 9800
TP: 76
FN: 124
FP: 1797
TN: 8003
Positive: 1873
> emit(c(Screen_prevalence = 100 * p), 0, "%")
Screen_prevalence: 2%
> emit(100 * c(pv(p), Accuracy = sum(x[c(1, 4)])/N),
+ 1, "%")
PPV: 4.1%
NPV: 98.5%
Accuracy: 80.8%
> ct <- 200
> cc <- 2000
> total <- N * ct + sum(r[c(1, 3)]) * cc
> exact <- N * ct + sum(x[c(1, 3)]) * cc
> emit(c(Test_THB = ct, Confirmation_THB = cc, Screening_THB = N *
+ ct, Confirmation_THB = sum(r[c(1, 3)]) * cc, Total_THB = total,
+ False .... [TRUNCATED]
Test_THB: 200
Confirmation_THB: 2000
Screening_THB: 2000000
Confirmation_THB: 3746000
Total_THB: 5746000
False_positive_THB.FP: 3594000
> emit(c(Total_million_THB = total/1e+06), 2)
Total_million_THB: 5.75
> emit(c(Cost_per_TP_THB = total/r[1]), 2)
Cost_per_TP_THB.TP: 75605.26
> emit(c(Cost_per_TP_nearest100 = round(total/r[1],
+ -2), Unrounded_model_per_TP_nearest100 = round(exact/x[1],
+ -2)))
Cost_per_TP_nearest100.TP: 75600
Unrounded_model_per_TP_nearest100.TP: 75700
> emit(c(False_positive_budget_share = 100 * r[3] *
+ cc/total), 1, "%")
False_positive_budget_share.FP: 62.5%
> z <- qnorm(0.975)
> ci <- function(k, m) ((k/m + z^2/(2 * m)) + c(-1,
+ 1) * z * sqrt((k/m) * (1 - k/m)/m + z^2/(4 * m^2)))/(1 +
+ z^2/m)
> emit(c(Confidence = 95), 0, "%")
Confidence: 95%
> emit(c(Se = se, Se_low = ci(a[1], sum(a[1:2]))[1],
+ Se_high = ci(a[1], sum(a[1:2]))[2], Sp = sp, Sp_low = ci(a[4],
+ sum(a[3:4]))[1], .... [TRUNCATED]
Se: 0.3793
Se_low: 0.2656
Se_high: 0.5080
Sp: 0.8167
Sp_low: 0.7380
Sp_high: 0.8757
> grid <- sort(unique(c(seq(0, 0.4, by = 0.01), p, ps)))
> for (q in grid) cat(sprintf("Plot prevalence=%.8f%% PPV=%.8f%% NPV=%.8f%%\n",
+ 100 * q, 100 * pv(q, round(se, 2), round(sp, 2))[1], 100 *
+ .... [TRUNCATED]
Plot prevalence=0.00000000% PPV=0.00000000% NPV=100.00000000%
Plot prevalence=1.00000000% PPV=2.08791209% NPV=99.24205379%
Plot prevalence=2.00000000% PPV=4.13043478% NPV=98.48039216%
Plot prevalence=3.00000000% PPV=6.12903226% NPV=97.71498771%
Plot prevalence=4.00000000% PPV=8.08510638% NPV=96.94581281%
Plot prevalence=5.00000000% PPV=10.00000000% NPV=96.17283951%
Plot prevalence=6.00000000% PPV=11.87500000% NPV=95.39603960%
Plot prevalence=7.00000000% PPV=13.71134021% NPV=94.61538462%
Plot prevalence=8.00000000% PPV=15.51020408% NPV=93.83084577%
Plot prevalence=9.00000000% PPV=17.27272727% NPV=93.04239401%
Plot prevalence=10.00000000% PPV=19.00000000% NPV=92.25000000%
Plot prevalence=11.00000000% PPV=20.69306931% NPV=91.45363409%
Plot prevalence=12.00000000% PPV=22.35294118% NPV=90.65326633%
Plot prevalence=13.00000000% PPV=23.98058252% NPV=89.84886650%
Plot prevalence=14.00000000% PPV=25.57692308% NPV=89.04040404%
Plot prevalence=15.00000000% PPV=27.14285714% NPV=88.22784810%
Plot prevalence=16.00000000% PPV=28.67924528% NPV=87.41116751%
Plot prevalence=17.00000000% PPV=30.18691589% NPV=86.59033079%
Plot prevalence=18.00000000% PPV=31.66666667% NPV=85.76530612%
Plot prevalence=19.00000000% PPV=33.11926606% NPV=84.93606138%
Plot prevalence=20.00000000% PPV=34.54545455% NPV=84.10256410%
Plot prevalence=21.00000000% PPV=35.94594595% NPV=83.26478149%
Plot prevalence=22.00000000% PPV=37.32142857% NPV=82.42268041%
Plot prevalence=23.00000000% PPV=38.67256637% NPV=81.57622739%
Plot prevalence=24.00000000% PPV=40.00000000% NPV=80.72538860%
Plot prevalence=25.00000000% PPV=41.30434783% NPV=79.87012987%
Plot prevalence=26.00000000% PPV=42.58620690% NPV=79.01041667%
Plot prevalence=27.00000000% PPV=43.84615385% NPV=78.14621410%
Plot prevalence=28.00000000% PPV=45.08474576% NPV=77.27748691%
Plot prevalence=29.00000000% PPV=46.30252101% NPV=76.40419948%
Plot prevalence=30.00000000% PPV=47.50000000% NPV=75.52631579%
Plot prevalence=31.00000000% PPV=48.67768595% NPV=74.64379947%
Plot prevalence=32.00000000% PPV=49.83606557% NPV=73.75661376%
Plot prevalence=32.58426966% PPV=50.50412466% NPV=73.23608217%
Plot prevalence=33.00000000% PPV=50.97560976% NPV=72.86472149%
Plot prevalence=34.00000000% PPV=52.09677419% NPV=71.96808511%
Plot prevalence=35.00000000% PPV=53.20000000% NPV=71.06666667%
Plot prevalence=36.00000000% PPV=54.28571429% NPV=70.16042781%
Plot prevalence=37.00000000% PPV=55.35433071% NPV=69.24932976%
Plot prevalence=38.00000000% PPV=56.40625000% NPV=68.33333333%
Plot prevalence=39.00000000% PPV=57.44186047% NPV=67.41239892%
Plot prevalence=40.00000000% PPV=58.46153846% NPV=66.48648649%
> emit(c(Plot_Se = round(se, 2), Plot_Sp = round(sp,
+ 2)), 2)
Plot_Se: 0.38
Plot_Sp: 0.82
> emit(setNames(seq(0, 40, 10), paste0("Prevalence_axis_",
+ seq(0, 40, 10))), 0, "%")
Prevalence_axis_0: 0%
Prevalence_axis_10: 10%
Prevalence_axis_20: 20%
Prevalence_axis_30: 30%
Prevalence_axis_40: 40%
> emit(setNames(seq(0, 100, 25), paste0("Predictive_axis_",
+ seq(0, 100, 25))), 0, "%")
Predictive_axis_0: 0%
Predictive_axis_25: 25%
Predictive_axis_50: 50%
Predictive_axis_75: 75%
Predictive_axis_100: 100%
> stopifnot(sum(r) == N, all(r == c(76, 124, 1797, 8003)),
+ total == 5746000, round(total/r[1], -2) == 75600)
ตรวจสอบว่าใครถูกคัดเข้าในการศึกษาความแม่นยำ
Spectrum bias คือความคลาดเคลื่อนเมื่อผู้ที่ศึกษาแตกต่างจากผู้ที่จะใช้การตรวจจริง การศึกษาแบบ two-gate รับผู้ที่ทราบว่ามีโรคและกลุ่มควบคุมแยกกัน ผู้ป่วยอาการรุนแรงและกลุ่มควบคุมที่สุขภาพดีเป็นพิเศษอาจทำให้การจำแนกดูง่ายกว่าการใช้งานทั่วไป
QUADAS-2 ช่วยจัดระบบการประเมินอคติและความสามารถในการนำการศึกษาความแม่นยำไปใช้ พิจารณาการเลือกผู้เข้าร่วม การตรวจที่ประเมิน มาตรฐานอ้างอิง และการติดตามกับช่วงเวลา STARD 2015 ช่วยให้รายงานโปร่งใส แต่การรายงานครบไม่ได้ขจัดอคติ
ความไม่แน่นอนจากการสุ่มตัวอย่างก็สำคัญ Sensitivity เท่ากับ 0.3793 โดยมี 95% Wilson confidence interval ตั้งแต่ 0.2656 ถึง 0.5080 Specificity เท่ากับ 0.8167 โดยมี 95% Wilson confidence interval ตั้งแต่ 0.7380 ถึง 0.8757 ช่วงเหล่านี้บอกความไม่แน่นอนจากการสุ่มในตัวอย่าง ไม่ได้บอกว่าจะใช้กับประชากรอื่นได้เพียงใด
การคัดกรองและการวินิจฉัยถามต่างกัน
การคัดกรองเชิญคนมาตรวจก่อนที่โรคเป้าหมายจะนำไปสู่การประเมินเพื่อวินิจฉัย การตรวจวินิจฉัยมักตามหลังอาการ อาการแสดง หรือผลตรวจอื่นที่ผิดปกติ ความน่าจะเป็นเริ่มต้นและลักษณะผู้มีโรคจึงอาจต่างกันมาก
การคำนวณข้างต้นเปลี่ยนความชุกโดยตรึง sensitivity และ specificity ไว้ นี่เป็นสมมติเพื่อการเรียนรู้ ไม่ใช่หลักประกันว่านำไปใช้กับประชากรอื่นได้ ความรุนแรง โรคร่วม เส้นทางส่งต่อ หรือวิธีดำเนินการตรวจที่เปลี่ยนไปอาจเปลี่ยนค่าแบบมีเงื่อนไขเหล่านี้ด้วย
กำหนดประชากรเป้าหมาย การดำเนินการหลังแต่ละผลตรวจ และกระบวนการยืนยันก่อนใช้งาน วัดความชุกในพื้นที่ด้วยวิธีสุ่มตัวอย่างที่เหมาะสม ตรวจสอบสมรรถนะซ้ำในประชากรนั้นแทนการนำ PPV จากการศึกษามาใช้ตรง ๆ
การตรวจพบเร็วขึ้นยังไม่ยืนยันว่าผลลัพธ์ดีขึ้น
Lead-time bias ทำให้ระยะรอดชีพที่วัดยาวขึ้นเพียงเพราะเริ่มนับเวลาเร็วขึ้น เวลาตายอาจเท่าเดิมแม้ช่วงเวลาหลังวินิจฉัยจะยาวขึ้น จึงควรเปรียบเทียบผลลัพธ์ตั้งแต่จัดสรรให้คัดกรอง ไม่ใช่เฉพาะการรอดชีพในผู้ที่ตรวจพบ
Length-time bias เกิดเพราะการคัดกรองมีโอกาสพบโรคที่อยู่ในระยะตรวจพบก่อนมีอาการนานกว่า โรคที่ดำเนินช้าอาจมีผลลัพธ์ดีกว่าแม้ไม่คัดกรอง ชุดข้อมูลผู้ที่ตรวจพบซึ่งดูมีผลลัพธ์ดีจึงอาจชวนให้เข้าใจผิด
Overdiagnosis คือการตรวจพบโรคจริงซึ่งจะไม่ทำให้เกิดอาการหรือเสียชีวิตตลอดช่วงชีวิตนั้น ต่างจากผลบวกลวงซึ่งไม่มีโรคเป้าหมาย การตรวจพบจึงอาจนำไปสู่ผลเสียจากการรักษาโดยไม่มีสุขภาพที่ดีขึ้นมาชดเชย
ข้ออ้างเรื่องลดการตายต้องอาศัย randomized screening trials ที่วัดการตาย สำหรับค่าตัวอย่างการคัดกรองภาวะซึมเศร้านี้ ไม่ได้สมมติว่าการรักษาลดการตาย ต้องประเมินอาการ การทำหน้าที่ คุณภาพชีวิต และผลเสียที่เกี่ยวข้องตลอดเส้นทางดูแล
เชื่อมการตรวจพบกับต้นทุนและสุขภาพที่เพิ่มขึ้น
ต้นทุนต่อผู้ป่วยจริงที่ตรวจพบคืองบโครงการหารด้วยจำนวนผู้มีโรคที่ตรวจพบ เป็นผลผลิตระหว่างทางและยังไม่ยืนยันความคุ้มค่า อีกทั้งเป็นต้นทุนเฉลี่ย ไม่ใช่การเปรียบเทียบส่วนเพิ่มกับการดูแลปกติ
Cost-utility analysis หรือการวิเคราะห์ต้นทุนอรรถประโยชน์ เปรียบเทียบต้นทุนกับสุขภาพที่เพิ่มขึ้นโดยใช้ quality-adjusted life-years (QALYs) Quality-adjusted life-year รวมระยะมีชีวิตกับน้ำหนักคุณภาพสุขภาพ ส่วน disutility คือการลดน้ำหนักคุณภาพนั้น เช่น ความทุกข์ใจชั่วคราวหลังผลบวกลวง
สร้างเส้นทางตั้งแต่เชิญเข้าร่วม การมาตรวจ การตรวจ การยืนยัน การรักษา จนถึงผลลัพธ์ รวมประสิทธิผลการรักษาหลังตรวจพบเร็วขึ้น ผู้ที่พลาดการตรวจพบ ความผิดพลาดในการยืนยัน และผู้ที่หลุดจากการติดตาม เพิ่มผลเสียจากผลบวกลวง overdiagnosis เมื่อเกี่ยวข้อง และช่วงห่างการคัดกรอง
ระบุว่านับต้นทุนของใครและใช้กรอบเวลานานเพียงใด เปรียบเทียบช่วงห่างและเกณฑ์ผลตรวจต่าง ๆ กับทางเลือกอ้างอิงที่ชัดเจน รวมถึงไม่มีโครงการเมื่อเหมาะสม ส่งผ่านความไม่แน่นอนของความแม่นยำ ความชุก ผลการรักษา ต้นทุน และคุณภาพสุขภาพเข้าในแบบจำลอง
บทความในชุดที่เชื่อมไว้ขยายเรื่องตัวหาร ความเชื่อมั่น การเปรียบเทียบส่วนเพิ่ม และโครงสร้างแบบจำลอง ใช้ EconMate เป็นเครื่องมือประกอบการเรียนรู้ ตรวจสอบวิธีปัดให้ตรงกับกล่อง R ก่อนเปรียบเทียบผล
เลือกเกณฑ์โดยพิจารณาผลที่ตามมา
เกณฑ์ตัดของผลตรวจเปลี่ยน sensitivity และ specificity พร้อมกัน การลดต้นทุนคาดหมายต้องระบุต้นทุนจากการพลาดโรค การยืนยันที่ไม่จำเป็น และการรักษาภายหลังอย่างชัดเจน เส้นทางที่ถูกอาจยังให้ผลลัพธ์สุขภาพไม่ดี
Threshold probability คือความน่าจะเป็นของโรคที่ทำให้ประโยชน์จากการดำเนินการคุ้มกับผลเสีย Decision curve analysis (DCA) เปรียบเทียบกลยุทธ์ทางคลินิกตลอดเกณฑ์เหล่านี้ Net benefit ของวิธีนี้นับผลบวกจริงและหักผลบวกลวงตามผลเสียสัมพัทธ์
$$NB=\frac{TP}{N}-\frac{FP}{N}\frac{p_t}{1-p_t}$$
ในที่นี้ $p_t$ คือ threshold probability ของการดำเนินการที่ระบุ เปรียบเทียบแบบจำลองกับการดำเนินการกับทุกคนและไม่ดำเนินการกับใคร ต้องระบุว่าการดำเนินการคือการยืนยันหรือการรักษา เพราะผลที่ตามมาต่างกัน
Net monetary benefit (NMB) กำหนดมูลค่าเงินให้สุขภาพที่เพิ่มขึ้นแล้วหักต้นทุน ให้ $\lambda$ แทนมูลค่าของ QALY, $Q$ แทนจำนวน QALYs และ $C$ แทนต้นทุน การเปรียบเทียบกลยุทธ์จึงเป็นการเปรียบเทียบ NMB คาดหมาย
$$NMB=\lambda Q-C$$
DCA และ NMB ต่างทำให้ผลที่ตามมาชัดเจน แต่ใช้หน่วยต่างกัน Clinical net benefit ไม่ใช่ผลตอบแทนในรูปเงิน การแปลงเป็นข้ออ้างทางเศรษฐศาสตร์ต้องอาศัยต้นทุนและผลลัพธ์ภายหลัง
ตรวจสอบ AI ในบริบทที่จะใช้งาน
Calibration คือความสอดคล้องระหว่างความน่าจะเป็นที่ทำนายกับความถี่ของโรคที่พบจริง แบบจำลองอาจเรียงลำดับผู้ป่วยได้ดีแต่ให้ความน่าจะเป็นที่คลาดเคลื่อน จึงอาจบิดเบือนการตัดสินใจที่อาศัยเกณฑ์ความน่าจะเป็น
TRIPOD+AI เป็นกรอบรายงานแบบจำลองทำนายที่ใช้ regression หรือ machine learning ควรรายงานวัตถุประสงค์ ข้อมูลพัฒนา ประชากรที่ใช้ตรวจสอบ การจัดการข้อมูลสูญหาย และสมรรถนะ แนวทางรายงานไม่ได้รับรองว่าแบบจำลองพร้อมใช้งาน
ตรวจความชุกในพื้นที่ calibration และความแม่นยำ ณ เกณฑ์ที่เลือก พิจารณากลุ่มผู้ป่วยที่เกี่ยวข้องและติดตามการเปลี่ยนแปลงหลังใช้งาน Recalibration ปรับความน่าจะเป็นที่ทำนาย แต่เพียงอย่างเดียวไม่สามารถยืนยันประโยชน์ของการคัดกรอง
อภิธานศัพท์
- Predictive values (ค่าทำนายผลการตรวจ)
- ความน่าจะเป็นที่จะมีโรคเมื่อผลบวก หรือไม่มีโรคเมื่อผลลบ
- Likelihood ratio (อัตราส่วนความน่าจะเป็นของผลตรวจ)
- ตัวคูณที่ผลตรวจใช้เปลี่ยน odds ของการมีโรค
- Spectrum bias (อคติจากความแตกต่างของกลุ่มผู้รับการตรวจ)
- ความคลาดเคลื่อนเมื่อผู้ป่วยในการศึกษาต่างจากผู้ที่จะใช้การตรวจจริง
- Lead-time bias (อคติจากการเลื่อนเวลาวินิจฉัย)
- การวินิจฉัยเร็วขึ้นทำให้ระยะรอดชีพที่วัดยาวขึ้น โดยอาจไม่ได้เลื่อนเวลาตาย
- Length-time bias (อคติจากการตรวจพบโรคที่ดำเนินช้า)
- การคัดกรองมีโอกาสพบโรคที่อยู่ในระยะตรวจพบก่อนมีอาการนานกว่า
- Overdiagnosis (การวินิจฉัยโรคที่ไม่ก่อปัญหาในช่วงชีวิต)
- การตรวจพบโรคจริงซึ่งจะไม่ทำให้เกิดอาการหรือเสียชีวิตตลอดช่วงชีวิตนั้น
- Cost-utility analysis (การวิเคราะห์ต้นทุนอรรถประโยชน์)
- การเปรียบเทียบต้นทุนกับสุขภาพที่เพิ่มขึ้นในหน่วย quality-adjusted life-years
- Quality-adjusted life-year (ปีสุขภาวะ)
- ระยะเวลาที่มีชีวิตซึ่งถ่วงน้ำหนักด้วยคุณภาพสุขภาพในช่วงนั้น ใช้ตัวย่อ QALY
- Disutility (การสูญเสียอรรถประโยชน์ทางสุขภาพ)
- การลดลงของน้ำหนักคุณภาพที่กำหนดให้ภาวะสุขภาพ
- Threshold probability (ความน่าจะเป็นที่ใช้เป็นเกณฑ์ตัดสินใจ)
- ความน่าจะเป็นของโรคที่ทำให้ผู้ตัดสินใจเห็นว่าประโยชน์ของการดำเนินการคุ้มกับผลเสีย
- Decision curve analysis (การวิเคราะห์เส้นโค้งการตัดสินใจ)
- การเปรียบเทียบกลยุทธ์โดยใช้ผลบวกจริงและผลบวกลวงที่ถ่วงน้ำหนักตาม threshold probability
- Net monetary benefit (ผลประโยชน์สุทธิในรูปเงิน)
- มูลค่าเงินที่กำหนดให้สุขภาพที่เพิ่มขึ้น หักด้วยต้นทุน
- Calibration (ความสอดคล้องระหว่างความเสี่ยงที่ทำนายกับที่พบจริง)
- ความสอดคล้องระหว่างความน่าจะเป็นที่ทำนายกับความถี่ของโรคที่สังเกตได้
เอกสารอ้างอิง
- HITAP Basic course, Day 1, Lecture 3 ค่าตัวอย่าง AI screening เพื่อการเรียนรู้ เรียบเรียงใหม่และให้เครดิต Verify: เลขหน้าสไลด์และรายละเอียดการรับผู้เข้าร่วมกับ PDF ต้นฉบับ
- เอกสารออกแบบบทความชุดที่ได้รับ หัวข้อ A7: ความแม่นยำ ค่าทำนายผลตรวจ และเศรษฐศาสตร์การคัดกรอง เป็นที่มาของสถานการณ์เพื่อการเรียนรู้และชื่อกรอบประเมินกับรายงาน
- รายงานผู้ให้คำปรึกษา EconMate ที่ได้รับ ส่วน diagnostic module และค่าตัวอย่างตรวจสอบการคำนวณ ใช้ตรวจทานจำนวนจากหลักสูตรและ Wilson intervals ต้นทุนในบทความเป็นค่าประกอบการเรียนรู้และยังไม่มีปีราคาที่ตรวจสอบแล้ว
ประเด็นสำคัญ
- คำนวณ predictive values ใหม่ตามความชุกของประชากรเป้าหมาย
- ตรวจลักษณะผู้ป่วยและความไม่แน่นอนก่อนสมมติว่า sensitivity และ specificity จะย้ายไปใช้ได้
- แยกงบตรวจยืนยันออกจากผลต่อสุขภาพของการคัดกรอง
- ต้นทุนต่อรายที่ตรวจพบเป็นผลผลิตระหว่างทาง ต้องเปรียบเทียบต้นทุนภายหลังกับสุขภาพที่เพิ่มขึ้น
- เลือกเกณฑ์ด้วยผลที่ตามมาที่ชัดเจน แล้วตรวจสอบทั้งเส้นทางในพื้นที่
อ่านต่อในวิกิ: พ้นจากพีระมิดหลักฐาน: ระดับความเชื่อมั่นตามแนวทาง GRADE และการเลือกข้อมูลประสิทธิผลเข้าสู่แบบจำลองทางเศรษฐศาสตร์ · อัตราส่วนต้นทุนประสิทธิผลส่วนเพิ่มและระนาบต้นทุนประสิทธิผล: ทางเลือกที่ด้อยกว่า ผลประโยชน์สุทธิ และเกณฑ์ 160,000 บาทต่อปีสุขภาวะ · ต้นไม้การตัดสินใจ แบบจำลองมาร์คอฟ และการวิเคราะห์ความไวเชิงความน่าจะเป็น: แบบจำลองแปลงหลักฐานเป็นการตัดสินใจได้อย่างไร · Diagnostic Indices: Sensitivity, Specificity, Predictive Values, and Beyond · ทำไม Sensitivity จึงไม่ใช่ Kappa: Performance vs Agreement