我應該如何處理這個二進制預測問題?
我有一個具有以下格式的數據集。
有癌症/無癌症的二元結果。數據集中的每位醫生都看過每位患者,並對患者是否患有癌症做出獨立判斷。然後醫生給出他們的診斷正確的置信度(滿分 5),置信度顯示在括號中。
我嘗試了各種方法來從這個數據集中獲得好的預測。
對我來說,只對醫生進行平均,忽略他們的信心水平,效果很好。在上表中,這將產生對患者 1 和患者 2 的正確診斷,儘管它會錯誤地說患者 3 患有癌症,因為醫生以 2-1 的多數認為患者 3 患有癌症。
我還嘗試了一種方法,我們隨機抽取兩名醫生,如果他們彼此不同意,那麼決定票將投給更自信的醫生。這種方法很經濟,我們不需要諮詢很多醫生,但也增加了相當多的錯誤率。
我嘗試了一種相關的方法,我們隨機選擇兩名醫生,如果他們彼此不同意,我們隨機選擇另外兩名。如果一個診斷至少領先兩個“投票”,那麼我們會解決有利於該診斷的事情。如果沒有,我們會繼續採樣更多的醫生。這種方法非常經濟,不會犯太多錯誤。
我不禁覺得我錯過了一些更複雜的做事方式。例如,我想知道是否有某種方法可以將數據集劃分為訓練集和測試集,並找出一些最佳方法來組合診斷,然後看看這些權重在測試集上的表現如何。一種可能性是某種方法可以讓我減輕在試驗集中不斷犯錯誤的醫生的體重,並可能提高以高置信度做出的診斷(置信度確實與該數據集的準確性相關)。
我有各種與此一般描述相匹配的數據集,因此樣本量各不相同,並非所有數據集都與醫生/患者有關。然而,在這個特定的數據集中,有 40 位醫生,每人接診了 108 名患者。
編輯:這是我閱讀@jeremy-miles 的答案後得出的一些權重的鏈接。
- 未加權的結果在第一列。實際上,在這個數據集中,最大置信度值為 4,而不是我之前誤說的 5。因此,按照@jeremy-miles 的方法,任何患者可以獲得的最高未加權分數將是 7。這意味著實際上每位醫生都以 4 的置信水平斷言該患者患有癌症。任何患者可以獲得的最低未加權分數是 0,這意味著每位醫生都以 4 的置信水平斷言該患者沒有癌症。
- 通過 Cronbach 的 Alpha 加權。我在 SPSS 中發現總體 Cronbach’s Alpha 為 0.9807。我試圖通過以更手動的方式計算 Cronbach 的 Alpha 來驗證這個值是否正確。我創建了所有 40 位醫生的協方差矩陣,我將其粘貼在這裡。然後基於我對 Cronbach’s Alpha 公式的理解 $ \alpha = \frac{K}{K-1}\left(1-\frac{\sum \sigma^2_{x_i}}{\sigma^2_T}\right) $ 在哪裡 $ K $ 是我計算的項目數(這裡的醫生是“項目”) $ \sum \sigma^2_{x_i} $ 通過對協方差矩陣中的所有對角元素求和,以及 $ \sigma^2_T $ 通過對協方差矩陣中的所有元素求和。然後我得到了 $ \alpha = \frac{40}{40-1}\left(1-\frac{8.7915}{200.7112}\right)=0.9807 $ 然後我計算了當每個醫生從數據集中刪除時會出現的 40 個不同的 Cronbach Alpha 結果。我將任何對 Cronbach’s Alpha 產生負面影響的醫生加權為零。我想出了與他們對 Cronbach’s Alpha 的積極貢獻成正比的剩餘醫生的權重。
- 按總項目相關性加權。我計算所有項目相關性,然後根據相關性大小對每個醫生進行加權。
- 通過回歸係數加權。
我仍然不確定的一件事是如何說哪種方法比另一種方法“更好”。以前我一直在計算諸如 Peirce Skill Score 之類的東西,它適用於存在二元預測和二元結果的情況。但是,現在我的預測範圍是 0 到 7,而不是 0 到 1。我是否應該將所有加權分數 > 3.50 轉換為 1,並將所有加權分數 < 3.50 轉換為 0?
首先,我會看看醫生是否彼此同意。您不能單獨分析 50 位醫生,因為您會過度擬合模型 - 一位醫生看起來很棒,這是偶然的。
您可以嘗試將信心和診斷結合到一個 10 分的量表中。如果醫生說患者沒有癌症,並且他們非常自信,那就是 0。如果醫生說他們確實患有癌症並且他們非常自信,那就是 9。如果醫生說他們沒有,並且不自信,那是5,等等。
當您嘗試進行預測時,您會進行某種回歸分析,但考慮到這些變量的因果順序,情況正好相反。患者是否患有癌症是診斷的原因,結果是診斷。
你的行應該是病人,你的列應該是醫生。您現在遇到了心理測量學中常見的情況(這就是我添加標籤的原因)。
然後看分數之間的關係。每個病人都有一個平均分,每個醫生都有一個分數。平均分數是否與每位醫生的分數呈正相關?如果不是,則該醫生可能不值得信賴(這稱為項目-總相關性)。有時您從總分(或平均分)中刪除一位醫生,然後查看該醫生是否與所有其他醫生的平均值相關 - 這是校正後的項目總相關性。
您可以計算 Cronbach 的 alpha(這是類內相關的一種形式),以及沒有每個醫生的 alpha。添加醫生時 Alpha 應該始終上升,因此如果刪除醫生時它會上升,則該醫生的評級是可疑的(這通常不會告訴您與校正後的項目總相關性有什麼不同)。
如果你使用 R,這種東西可以在 psych 包中使用,使用函數 alpha。如果您使用 Stata,則命令是 alpha,在 SAS 中是 proc corr,在 SPSS 中是規模不足的可靠性。
然後,您可以計算一個分數,作為每位醫生的平均分數,或加權平均值(由相關性加權),並查看該分數是否可以預測真實診斷。
或者您可以跳過該階段,分別回歸每個醫生的診斷分數,並將回歸參數視為權重。
隨時要求澄清,如果你想要一本書,我喜歡 Streiner 和 Norman 的“健康測量量表”。
- 編輯:基於 OP 的附加信息。
哇,這真是一個克朗巴赫的阿爾法。我唯一一次看到它這麼高是犯了錯誤。
我現在將進行邏輯回歸併查看 ROC 曲線。
回歸加權和相關加權之間的差異取決於您認為醫生的反應如何。一些文檔通常可能更自信(沒有更熟練),因此他們可能更多地使用極端範圍。如果您想對此進行校正,請使用相關性而不是回歸來進行校正。我可能會通過回歸加權,因為這會保留原始數據(並且不會丟棄任何信息)。
編輯(2):我在 R 中運行邏輯回歸模型,看看每個模型對輸出的預測效果如何。tl/dr:他們之間什麼都沒有。
這是我的代碼:
d <- read.csv("Copy of Cancer data - Weightings.csv") mrc <- glm(cancer ~ weightrc, data = d, family = "binomial") mun <- glm(cancer ~ unweight, data = d, family = "binomial") mca <- glm(cancer ~ weightca, data = d, family = "binomial") mic <- glm(cancer ~ weightic, data = d, family = "binomial") d$prc <- predict(mrc, type = "response") d$pun <- predict(mun, type = "response") d$pca <- predict(mca, type = "response") d$pic <- predict(mic, type = "response") par(mfrow = c(2, 2)) roc(d$cancer, d$prc, ci = TRUE, plot = TRUE) roc(d$cancer, d$pun, ci = TRUE, plot = TRUE) roc(d$cancer, d$pca, ci = TRUE, plot = TRUE) roc(d$cancer, d$pic, ci = TRUE, plot = TRUE)
和輸出:
> par(mfrow = c(2, 2)) > roc(d$cancer, d$prc, ci = TRUE, plot = TRUE) Call: roc.default(response = d$cancer, predictor = d$prc, ci = TRUE, plot = TRUE) Data: d$prc in 81 controls (d$cancer 0) < 27 cases (d$cancer 1). Area under the curve: 0.9831 95% CI: 0.9637-1 (DeLong) > roc(d$cancer, d$pun, ci = TRUE, plot = TRUE) Call: roc.default(response = d$cancer, predictor = d$pun, ci = TRUE, plot = TRUE) Data: d$pun in 81 controls (d$cancer 0) < 27 cases (d$cancer 1). Area under the curve: 0.9808 95% CI: 0.9602-1 (DeLong) > roc(d$cancer, d$pca, ci = TRUE, plot = TRUE) Call: roc.default(response = d$cancer, predictor = d$pca, ci = TRUE, plot = TRUE) Data: d$pca in 81 controls (d$cancer 0) < 27 cases (d$cancer 1). Area under the curve: 0.9854 95% CI: 0.9688-1 (DeLong) > roc(d$cancer, d$pic, ci = TRUE, plot = TRUE) Call: roc.default(response = d$cancer, predictor = d$pic, ci = TRUE, plot = TRUE) Data: d$pic in 81 controls (d$cancer 0) < 27 cases (d$cancer 1). Area under the curve: 0.9822 95% CI: 0.9623-1 (DeLong)