[PYTHON] Si la précision du test PCR est mauvaise, pourquoi ne pas répéter le test?

introduction

Qiita a également publié des articles sur la fiabilité des tests PCR pour le coronavirus.

Je pense que tout cela est correct, mais en réalité, ils sont inspectés plusieurs fois. Alors peu importe si le test PCR n'est pas très sensible ou si la spécificité n'est pas parfaite, n'est-ce pas? Dans quelle mesure pouvez-vous vous améliorer en testant plusieurs fois? J'avais une question, alors je l'ai recherchée.

Définition des termes à nouveau

La sensibilité et la spécificité des tests sont souvent présentées dans des articles et autres.

D'autre part, il est important de discuter s'il est préférable ou non d'effectuer un test PCR avec COVID-19. Lorsque le résultat du test est positif, c'est la probabilité d'avoir effectivement le virus ** précision positive ** [^ 1], Probabilité que le résultat du test ne soit pas réellement infecté par le virus lorsque l'étudiant est un étudiant diplômé ** Précision négative **.

[^ 1]: Il ne s'agit pas de "taux positif / prédictif" mais de "taux positif / prédictif".

Comme nous le verrons, ces valeurs varient fortement en fonction de la probabilité antérieure.

Si vous écrivez ceci comme une table de continuité, ce sera comme suit [^ 4].

True state
Affecté Non affecté
Inspection
Inspection
Conclusion
Résultat
Positive $$ \begin{matrix} \ text {vrai positif} \\ \text{(true positive)} \\ \end{matrix} = a $$ $$ \begin{matrix} \ text {faux positif} \\ \text{(false positive)} \\ \end{matrix} = b $$ $$ \begin{matrix} \ text {Valeur prédictive positive} \\ \text{(positive precision)} \\ \end{matrix} = \frac{a}{a+b} $$
Negative $$ \begin{matrix} \ text {faux négatif} \\ \text{(false negative)} \\ \end{matrix} = c $$ $$ \begin{matrix} \ text {vrai négatif} \\ \text{(true negative)} \\ \end{matrix} = d $$ $$ \begin{matrix} \ text {Valeur prédictive négative} \\ \text{(negative precision)} \\ \end{matrix} = \frac{d}{c+d} $$
$$ \begin{matrix} \ text {sensibilité} \\ \text{(sensitivity)} \\ \end{matrix} = \frac{a}{a+c} $$ $$ \begin{matrix} \ text {singularité} \\ \text{(specificity)} \\ \end{matrix} = \frac{d}{b+d} $$

[^ 4]: J'ai du mal à modifier le tableau. Il est difficile pour un amateur de changer avec Markdown.

Valeur prédictive positive, valeur prédictive négative

Sensibilité = $ \ frac {a} {a + c} $ et spécificité = $ \ frac {d} {b + d} $ et probabilité a priori = $ \ frac {a + Supposons que l'on vous donne c} {a + b + c + d} $. Si vous définissez le nombre total d'échantillons sur $ a + b + c + d = 1 $ et trouvez la valeur prédictive positive et la valeur prédictive négative,

\text{positive precision} = \frac{ \text{sensitivity} \cdot \text{prior probability} }{ \text{sensitivity} \cdot \text{prior probability} + (1 - \text{specificity}) * (1 - \text{prior probability}) }
\text{negative precision} = \frac{ \text{specificity} \cdot (1 - \text{prior probability}) }{ (1 - \text{sensitivity}) \cdot \text{prior probability} + \text{specificity} \cdot (1 - \text{prior probability}) }

Cela devient [^ 3].

[^ 3]: Pourquoi? Cet article , Il vous suffit de résoudre les équations simultanées.

Après cela, cet article Supposons $ et calculons.

import matplotlib.pyplot as plt
import numpy as np

sensitivity = 0.70  #Sensibilité d'un test. La probabilité que le test soit positif lorsque vous êtes affecté.
specificity = 0.95  #La spécificité d'un seul test. La probabilité que le test soit négatif s'il n'est pas affecté.

def positive_precision(prior_probability, sensitivity, specificity):
    '''
    Args:
        prior_probability:Pré-probabilité. Probabilité d'être affecté lorsqu'il n'y a pas de prérequis.
        sensitivity:sensibilité. Probabilité d'être positif lors du test des patients affectés.
        specificity:Singularité. Probabilité d'être négatif lors du test de patients non affectés.
    Returns:
        positive_precision:Valeur prédictive positive. La probabilité d'être réellement affecté lorsque le résultat du test est positif.
    '''
    return sensitivity * prior_probability / (sensitivity * prior_probability + (1 - specificity) * (1 - prior_probability))

def negative_precision(prior_probability, sensitivity, specificity):
    '''
    Args:
        prior_probability:Pré-probabilité. Probabilité d'être affecté lorsqu'il n'y a pas de prérequis.
        sensitivity:sensibilité. Probabilité d'être positif lors du test des patients affectés.
        specificity:Singularité. Probabilité d'être négatif lors du test de patients non affectés.
    Returns:
        negative_precision:Valeur prédictive négative. La probabilité que vous ne soyez pas réellement affecté lorsque le résultat du test est négatif.
    '''
    return specificity * (1 - prior_probability) / ((1 - sensitivity) * prior_probability + specificity * (1 - prior_probability))

Ici, les fonctions positive_precision () et negative_precision (), comme leur nom l'indique, obtiennent respectivement la valeur prédictive positive et la valeur prédictive négative à partir de la probabilité, de la sensibilité et de la singularité antérieures données par les arguments.

Si vous testez n fois et que toutes les n fois sont négatives, vous pensez que c'est négatif

En d'autres termes, considérons un cas basé sur une façon pessimiste de penser que si vous testez plusieurs fois et obtenez un résultat positif même une fois, vous serez positif. Tracons la probabilité a priori et le nombre de vérifications $ n $ sur le graphique.

def sensitivity_pessimistic(sensitivity, n):
    '''
    Args:
        sensitivity:Sensibilité d'un test
        n:Nombre d'inspections
    Returns:
Sensibilité d'inspection n fois:Sensibilité du test à considérer comme négatif si tous sont négatifs après n tests
    '''
    return 1 - (1 - sensitivity) ** n

def specificity_pessimistic(specificity, n):
    '''
    Args:
        specificity:Spécificité d'un test
        n:Nombre d'inspections
    Returns:
Spécificité du test n temps:La spécificité du test est considérée comme négative si tous sont négatifs après n tests
    '''
    return specificity ** n

xs = [ np.exp(-0.05 * i) for i in range(0, 200)]
ys_list = []
legend_list = []
for n in [1, 3, 5]:
    ys_list.append([ positive_precision(x, sensitivity_pessimistic(sensitivity, n), specificity_pessimistic(specificity, n)) for x in xs ])
    legend_list.append('Inspection{}Valeur prédictive positive au moment de la mise en œuvre'.format(n))
for n in [1, 3, 5]:
    ys_list.append([ negative_precision(x, sensitivity_pessimistic(sensitivity, n), specificity_pessimistic(specificity, n)) for x in xs ])
    legend_list.append('Inspection{}Valeur prédictive négative au moment de la mise en œuvre'.format(n))
    
fig, ax = plt.subplots()
plt.xscale('log')

for ys in ys_list:
    ax.plot(xs, ys)
ax.legend(legend_list)
ax.set_xlabel('Probabilité de pré-morbidité')
ax.set_title('Précision de plusieurs tests PCR(Négatif si testé n fois et tous négatifs)')
plt.show()

fig1.png

Cette idée pessimiste selon laquelle «si vous obtenez un résultat positif même une fois, vous êtes malade» peut être proche de la façon de penser actuelle de la société. Cela peut sembler bon parce que vous êtes du bon côté, mais lorsque la pré-probabilité est faible, vous pouvez finir par traiter un grand nombre de personnes qui ne sont pas réellement touchées comme touchées. Les hôpitaux et les installations d'isolement peuvent être perforés et difficiles.

Par exemple, à ce jour (18 avril 2020), le nombre de personnes infectées confirmées au Japon [^ 2] est supérieur à 9 000, mais il y a 100 000 (10 $ ^ 5) $ véritablement infectés, soit 10 fois ce nombre. Supposez que vous l'êtes. En supposant que la population totale du Japon est de 100 millions (10 ^ 8 ), la pré-probabilité de personnes sélectionnées au hasard est $ \ text {probabilité a priori} = \ frac {nombre réel de personnes infectées} {population totale} = \ frac {10 ^ 5} {10 ^ 8} = 10 ^ {-3} $$ Et, comme vous pouvez le voir dans le graphique ci-dessus où l'axe horizontal est $ 10 ^ {-3} $, il n'est pas exagéré de dire qu'il ne sert à rien d'inspecter la personne qui l'a choisi comme une merde. Est-ce trop à dire?

[^ 2]: Je ne connais pas bien la définition, mais c'est le nombre annoncé par le gouvernement local, et c'est probablement le nombre de personnes qui ont été ** positives ** même une fois au test PCR.

Dans le cas d'un test considéré comme positif s'il est testé n fois et que toutes les n fois sont positives

Ensuite, que se passe-t-il si vous adoptez une façon de penser très optimiste, en la secouant dans la direction opposée et en pensant que si vous obtenez un négatif même une fois, vous pensez qu'il est négatif. Tracons-le sur le graphique en modifiant la probabilité a priori et le nombre d'inspections $ n $.

def sensitivity_optimistic(sensitivity, n):
    '''
    Args:
        sensitivity:Sensibilité d'un test
        n:Nombre d'inspections
    Returns:
Sensibilité d'inspection n fois:Sensibilité du test à être considéré comme positif lorsque n fois sont testés et que tous sont positifs n fois
    '''
    return sensitivity ** n

def specificity_optimistic(specificity, n):
    '''
    Args:
        specificity:Spécificité d'un test
        n:Nombre d'inspections
    Returns:
Spécificité du test n temps:Spécificité du test considéré comme positif lorsque n fois sont testés et que tous sont positifs n fois
    '''
    return 1 - (1 - specificity) ** n

xs = [ np.exp(-0.05 * i) for i in range(0, 200)]
ys_list = []
legend_list = []
for n in [1, 3, 5]:
    ys_list.append([ positive_precision(x, sensitivity_optimistic(sensitivity, n), specificity_optimistic(specificity, n)) for x in xs ])
    legend_list.append('Inspection{}Valeur prédictive positive au moment de la mise en œuvre'.format(n))
for n in [1, 3, 5]:
    ys_list.append([ negative_precision(x, sensitivity_optimistic(sensitivity, n), specificity_optimistic(specificity, n)) for x in xs ])
    legend_list.append('Inspection{}Valeur prédictive négative au moment de la mise en œuvre'.format(n))
    
fig, ax = plt.subplots()
plt.xscale('log')

for ys in ys_list:
    ax.plot(xs, ys)
ax.legend(legend_list)
ax.set_xlabel('Probabilité de pré-morbidité')
ax.set_title('Précision de plusieurs tests PCR(Testé n fois et positif si tous sont positifs)')
plt.show()

fig2.png

De cette façon, en testant plusieurs fois, nous avons pu augmenter considérablement la probabilité d'être positif, même si la pré-probabilité était très faible.

Inutile de dire que si vous avez une forte fièvre ou une pneumonie, il est très logique de faire un test, car vous avez plus de chances d'avoir le COVID-19. .. Cela est dû au fait que le taux positif et le taux négatif sont élevés, quel que soit le graphique ci-dessus pris.

Résumé

Les personnes dont le test est positif même une fois sont susceptibles d'être traitées comme des personnes infectées, mais je pense que les gens ordinaires ne sont pas encore condamnés parce que la pré-probabilité n'est pas si élevée. Je vais. Dans le contexte clinique réel, il est probable que les personnes qui examinent d'autres symptômes (pneumonie, anomalies du goût et de l'odorat, etc.) soient sélectionnées pour les tests (= personnes ayant une probabilité antérieure suffisamment élevée).

De plus, lorsque vous sortez de l'hôpital, il semble que vous effectuez correctement des tests PCR à plusieurs reprises, et s'il est négatif deux fois de suite, vous êtes renvoyé.

Je ne sais pas.

J'ai mis le notebook jupyter sur github. Je suis désolé si j'ai fait une erreur.

Recommended Posts

Si la précision du test PCR est mauvaise, pourquoi ne pas répéter le test?
FAQ: Pourquoi la comparaison des nombres est-elle incohérente?
La valeur de pyTorch torch.var () n'est pas distribuée
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Pourquoi le premier argument de la classe [Python] est-il self?
[Golang] "Le package exec n'est pas dans GOROOT" lors de l'exécution du test
Tester la version du module argparse
La probabilité de précipitation est-elle correcte?
Déterminez si la chaîne est formatable
Déterminez si la bibliothèque est installée.
Science "Saito est-il le représentant de Saito?"
Pourquoi l'entropie croisée est-elle utilisée pour la fonction objective du problème de classification?
Je pense que la limite du sac à dos n'est pas le poids mais le volume w_11 / 22update