Comment dois-je aborder ce problème de prédiction binaire?


9

J'ai un ensemble de données au format suivant.

Prévisions de cancer pas de cancer

Il y a un cancer binaire / pas de cancer. Chaque médecin de l'ensemble de données a vu chaque patient et a donné un jugement indépendant sur le fait que le patient soit atteint ou non d'un cancer. Les médecins donnent ensuite leur niveau de confiance sur 5 que leur diagnostic est correct, et le niveau de confiance est affiché entre parenthèses.

J'ai essayé différentes façons d'obtenir de bonnes prévisions de cet ensemble de données.

Cela fonctionne assez bien pour moi de simplement faire la moyenne parmi les médecins, en ignorant leur niveau de confiance. Dans le tableau ci-dessus, cela aurait produit des diagnostics corrects pour le patient 1 et le patient 2, bien qu'il aurait dit à tort que le patient 3 a un cancer, car par une majorité de 2-1 les médecins pensent que le patient 3 a un cancer.

J'ai également essayé une méthode dans laquelle nous échantillonnons au hasard deux médecins, et s'ils ne sont pas d'accord, le vote décisif revient au médecin le plus confiant. Cette méthode est économique dans la mesure où nous n'avons pas besoin de consulter beaucoup de médecins, mais elle augmente également considérablement le taux d'erreur.

J'ai essayé une méthode connexe dans laquelle nous sélectionnons au hasard deux médecins, et s'ils ne sont pas d'accord, nous en sélectionnons deux de plus au hasard. Si un diagnostic est avancé par au moins deux «votes», nous résolvons les choses en faveur de ce diagnostic. Sinon, nous continuons d'échantillonner plus de médecins. Cette méthode est assez économique et ne fait pas trop d'erreurs.

Je ne peux pas m'empêcher de sentir que je manque une façon plus sophistiquée de faire les choses. Par exemple, je me demande s'il existe un moyen de diviser l'ensemble de données en ensembles de formation et de test, et de trouver un moyen optimal de combiner les diagnostics, puis de voir comment ces poids fonctionnent sur l'ensemble de test. Une possibilité est une sorte de méthode qui me permet de réduire le poids des médecins qui ont continué à faire des erreurs sur l'ensemble d'essai, et peut-être des diagnostics de poids élevé qui sont faits avec une confiance élevée (la confiance est en corrélation avec l'exactitude de cet ensemble de données).

J'ai différents jeux de données correspondant à cette description générale, donc la taille des échantillons varie et tous les jeux de données ne concernent pas les médecins / patients. Cependant, dans cet ensemble de données particulier, il y a 40 médecins, qui ont chacun vu 108 patients.

EDIT: Voici un lien vers certaines des pondérations qui résultent de ma lecture de la réponse de @ jeremy-miles.

  1. Les résultats non pondérés figurent dans la première colonne. En fait, dans cet ensemble de données, la valeur de confiance maximale était de 4 et non de 5, comme je l'ai dit par erreur plus tôt. Ainsi, en suivant l'approche de @ jeremy-miles, le score non pondéré le plus élevé qu'un patient pourrait obtenir serait de 7. Cela signifierait que littéralement chaque médecin a affirmé avec un niveau de confiance de 4 que ce patient avait un cancer. Le score non pondéré le plus bas qu'un patient puisse obtenir est de 0, ce qui signifie que chaque médecin a affirmé avec un niveau de confiance de 4 que ce patient n'avait pas de cancer.

  2. Pondération par Alpha de Cronbach. J'ai trouvé dans SPSS qu'il y avait un alpha global de Cronbach de 0,9807. J'ai essayé de vérifier que cette valeur était correcte en calculant l'Alpha de Cronbach de manière plus manuelle. J'ai créé une matrice de covariance des 40 médecins que je colle ici . Ensuite, d'après ma compréhension de la formule Alpha de Cronbach où est le nombre d'items (ici les médecins sont les 'items') j'ai calculé en additionnant tous les éléments diagonaux dans la matrice de covariance, et en additionnant tous les éléments dans la matrice de covariance. J'ai ensuiteα=KK1(1σxi2σT2)Kσxi2σT2α=4040-1(1-8.7915200.7112)=0,9807 J'ai ensuite calculé les 40 résultats différents de Cronbach Alpha qui se produiraient lorsque chaque médecin serait retiré du base de données. J'ai évalué à zéro tout médecin qui avait contribué négativement à l'Alpha de Cronbach. J'ai trouvé des poids pour les médecins restants proportionnels à leur contribution positive à l'Alpha de Cronbach.

  3. Pondération par total des corrélations d'articles. Je calcule toutes les corrélations totales des éléments, puis pondère chaque médecin proportionnellement à la taille de leur corrélation.

  4. Pondération par les coefficients de régression.

Une chose dont je ne suis toujours pas sûr est de savoir quelle méthode fonctionne "mieux" que l'autre. Auparavant, j'avais calculé des choses comme le score de compétence Peirce, qui est approprié pour les cas où il y a une prédiction binaire et un résultat binaire. Cependant, j'ai maintenant des prévisions allant de 0 à 7 au lieu de 0 à 1. Dois-je convertir tous les scores pondérés> 3,50 en 1 et tous les scores pondérés <3,50 en 0?


Pouvons-nous dire que No Cancer (3)c'est le cas Cancer (2)? Cela simplifierait un peu votre problème.
Wayne

1
Re: votre structure de données, il est presque toujours préférable d'avoir différentes variables (si le patient a un cancer; dans quelle mesure l'évaluation est confiante) dans différentes colonnes. Les combiner comme dans "pas de cancer (3)" limite considérablement vos options.
rolando2

@Wayne Les données vont de la prédiction d'un cancer avec une confiance maximale Cancer (4)à la prédiction d'aucun cancer avec une confiance maximale No Cancer (4). Nous ne pouvons pas dire cela No Cancer (3)et ce Cancer (2)sont les mêmes, mais nous pourrions dire qu'il y a un continuum, et les points médians de ce continuum sont Cancer (1)et No Cancer (1).
user1205901

@ rolando2 Merci pour les conseils. J'ai réorganisé les choses dans mon propre fichier de données afin qu'elles soient maintenant séparées.
user1205901

1
Notez que votre seuil est un paramètre ajustable , la coupure appropriée dépendra donc de votre critère d'évaluation. Comme je ne connaissais pas votre métrique, je l'ai recherchée sur Google, et en fait, le premier coup peut vous intéresser: une note sur le score de compétence Peirce maximum (2007) .
GeoMatt22

Réponses:


7

Tout d'abord, je verrais si les médecins sont d'accord. Vous ne pouvez pas analyser 50 médecins séparément, car vous suréquiperez le modèle - un médecin aura fière allure, par hasard.

Vous pouvez essayer de combiner la confiance et le diagnostic sur une échelle de 10 points. Si un médecin dit que le patient n'a pas de cancer et qu'il est très confiant, c'est un 0. Si le doc dit qu'il a un cancer et qu'il est très confiant, c'est un 9. S'il doc dit qu'il n'en a pas, et ne sont pas confiants, c'est un 5, etc.

Lorsque vous essayez de prédire, vous effectuez une sorte d'analyse de régression, mais en pensant à l'ordre causal de ces variables, c'est l'inverse. Que le patient soit atteint d'un cancer soit la cause du diagnostic, le résultat est le diagnostic.

Vos rangées devraient être des patients et vos colonnes devraient être des médecins. Vous avez maintenant une situation courante en psychométrie (c'est pourquoi j'ai ajouté la balise).

Ensuite, regardez les relations entre les scores. Chaque patient a un score moyen et un score de chaque médecin. Le score moyen est-il en corrélation positive avec le score de chaque médecin? Sinon, ce médecin n'est probablement pas digne de confiance (c'est ce qu'on appelle la corrélation article-total). Parfois, vous supprimez un médecin du score total (ou score moyen) et voyez si ce médecin est en corrélation avec la moyenne de tous les autres médecins - il s'agit de la corrélation totale de l'élément corrigé.

Vous pouvez calculer l'alpha de Cronbach (qui est une forme de corrélation intra-classe) et l'alpha sans chaque médecin. L'alpha devrait toujours augmenter lorsque vous ajoutez un médecin, donc s'il augmente lorsque vous supprimez un médecin, la note de ce médecin est suspecte (cela ne vous dit souvent rien de différent de la corrélation article-total corrigée).

Si vous utilisez R, ce genre de chose est disponible dans le paquet psych, en utilisant la fonction alpha. Si vous utilisez Stata, la commande est alpha, dans SAS c'est proc corr, et dans SPSS c'est sous échelle, fiabilité.

Ensuite, vous pouvez calculer un score, comme le score moyen de chaque médecin, ou la moyenne pondérée (pondérée par la corrélation) et voir si ce score est prédictif du vrai diagnostic.

Ou vous pouvez sauter cette étape, régresser séparément le score de chaque médecin au diagnostic et traiter les paramètres de régression comme des poids.

N'hésitez pas à demander des éclaircissements, et si vous voulez un livre, j'aime "Health Measurement Scales" de Streiner et Norman.

-Edit: basé sur les informations supplémentaires OPs.

Wow, c'est un sacré alpha de Cronbach. La seule fois où je l'ai vu aussi haut, c'est quand une erreur a été commise.

Je ferais maintenant une régression logistique et regarderais les courbes ROC.

La différence entre la pondération par régression et la corrélation dépend de la façon dont vous pensez que les médecins réagissent. Certains documents peuvent être généralement plus confiants (sans être plus habiles), et donc ils peuvent utiliser davantage les plages extrêmes. Si vous voulez corriger cela, utilisez la corrélation plutôt que la régression. Je pondérerais probablement par régression, car cela conserve les données d'origine (et ne supprime aucune information).

Edit (2): J'ai exécuté des modèles de régression logistique dans R pour voir dans quelle mesure chacun prédisait la sortie. tl / dr: il n'y a rien entre eux.

Voici mon code:

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)

4 courbes ROC

Et la sortie:

> 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)

1
Très bien. Et, comme votre raisonnement le permet, il est possible qu'un médecin aggrave l'alpha en apportant une vision unique tout en contrecarrant la tendance.
rolando2

@ jeremy-miles Merci pour cette réponse et la gentille offre de répondre aux questions à ce sujet. J'ai essayé de mettre en œuvre ce que vous avez suggéré et j'ai modifié l'OP pour publier certains résultats. La principale chose que je me demande est de savoir si j'ai correctement interprété votre message, et aussi ce qu'il faudrait pour montrer que certaines méthodes d'agrégation fonctionnent mieux que d'autres méthodes pour prédire le résultat.
user1205901

Merci d'avoir publié les données. J'y reviendrai plus tard. (Quel logiciel utilisez-vous?)
Jeremy Miles

@JeremyMiles Merci d'avoir posté cette modification! J'utilise MATLAB, mais j'en sais assez sur R pour passer à la vitesse supérieure et l'utiliser à la place, puisque vous avez déjà publié le code R. J'ai calculé que l'Alpha de Cronbach dans SPSS - obtenez-vous une valeur différente de R?
user1205901

1
Oui, c'est ce que je pensais. Ainsi, chaque médecin a un poids différent.
Jeremy Miles

2

Deux suggestions prêtes à l'emploi:

  1. Vous pouvez utiliser des poids sur la fonction de perte de votre régression logistique, de sorte que le médecin qui est très certain que le patient a un cancer avec P = 1 double l'impact en a un autre qui dit qu'il a un cancer avec P = 0,75. N'oubliez pas de transformer correctement vos probabilités en poids.
  2. Une famille de modèles souvent négligés sont les modèles de classement. Au sein des classeurs, il y a trois grands groupes: classement par liste, par point et par paire, en fonction de votre entrée. Il semble que vous puissiez utiliser le classement par points dans votre cas.

Pouvez-vous suggérer un moyen de transformer correctement les probabilités en poids? J'ai essayé de googler ce concept, mais je n'ai trouvé aucun conseil clair sur la façon de procéder.
user1205901

@ user1205901, je pensais à quelque chose de très simple comme: Let P= probabilité d'être un cancer donné par le médecin, puis (en notation python): y=[1 if p >= 0.5 else 0 for p in P]et w=[abs(p-0.5)*2 for p in P]. Ensuite, entraînez le modèle:LogisticRegression().fit(X,y,w)
Ricardo Cruz

Dans la fonction de perte, cela donnera, par exemple, le double du poids à 0,1 à 0,2 pour ne pas être cancéreux (0,1 -> 0,8 et 0,2 -> 0,6). Si le médecin n'est pas sûr (P ~ 0,5), l'observation ne contribue presque pas à la perte. Quel que soit le modèle qu'il utilise, il doit prendre en charge l'ajout d'un vecteur de coût à la fonction de perte, que la plupart des modèles prennent en charge. Je ne sais pas si c'est bon, mais cela semble trivial d'essayer. Il doit d'abord spécifier une métrique. La fonction de perte peut être davantage adaptée à la métrique qu'il souhaite maximiser.
Ricardo Cruz

2

(Ceci est hors de mon domaine d'expertise, donc la réponse de Jeremy Miles peut être plus fiable.)

Voici une idée.

je=1Ncje{0,1}j=1mjej{0,1}

jejcje

p[c]1Njecje

p[j|c]jejejcjejecje
jcje

p[j|c,wj]jejejwjejcjejewjejcje
wjej0jej

w[0,1]

p[w]=w(1-)1-w
=0

0^0=10^0=NaNw(0,1)k{1K}w=k/(K+1)


No Cancer (3) = Cancer (2)w[k]=kK25=1-35No Cancer (3) = Cancer (3)w[k]=kK+136=1-36

p[j|c,wj]jejejwjejcjejewjejcje

δ[0,1]{0,1}δje=wje(je=1)+(1-wje)(je=0)δ=[0,8,0,4,0,8]p[c,δ]=cδ¯=0,8+0+0,83=230,8p[2]=c¯=23p[δ]=δ¯=560,8p[c|δ]=p[c,δ]/p[δ]=0,8p[δ|c]=p[c,δ]/p[c]=0,8

0

D'après votre question, il apparaît que ce que vous voulez tester est votre système de mesure. Dans le domaine de l'ingénierie des processus, il s'agirait d'une analyse de système de mesure d'attributs ou MSA.

Ce lien fournit des informations utiles sur la taille d'échantillon nécessaire et les calculs effectués pour mener une étude de ce type. https://www.isixsigma.com/tools-templates/measurement-systems-analysis-msa-gage-rr/making-sense-attribute-gage-rr-calculations/

Avec cette étude, vous auriez également besoin du médecin pour diagnostiquer le même patient avec les mêmes informations au moins deux fois.

Vous pouvez mener cette étude de deux manières. Vous pouvez utiliser la cote simple cancer / pas de cancer pour déterminer l'accord entre les médecins et par chaque médecin. Idéalement, ils devraient également pouvoir diagnostiquer avec le même niveau de confiance. Vous pouvez ensuite utiliser l'échelle complète de 10 points pour tester l'accord entre et par chaque médecin. (Tout le monde devrait convenir que le cancer (5) est la même note, qu'aucun cancer (1) n'est la même note, etc.)

Les calculs dans le site Web lié sont simples à effectuer sur n'importe quelle plateforme que vous utilisez pour vos tests.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.