[PYTHON] Wenn die Genauigkeit des PCR-Tests schlecht ist, warum nicht den Test wiederholen?

Einführung

Qiita hat auch einige Beiträge zur Zuverlässigkeit von PCR-Tests auf Coronavirus veröffentlicht.

Ich denke, all dies ist richtig, aber in Wirklichkeit werden sie mehrmals überprüft. Dann spielt es keine Rolle, ob der PCR-Test nicht sehr empfindlich ist oder die Spezifität nicht perfekt ist, nicht wahr? Wie viel besser können Sie durch mehrmaliges Testen werden? Ich hatte eine Frage und habe sie nachgeschlagen.

Wieder Definition von Begriffen

Testempfindlichkeit und -spezifität werden häufig in Papieren und dergleichen gezeigt.

Andererseits ist es wichtig zu diskutieren, ob es besser ist, einen PCR-Test mit COVID-19 durchzuführen oder nicht. Wenn das Testergebnis positiv ist, ist es die Wahrscheinlichkeit, dass das Virus tatsächlich ** positive Präzision ** hat [^ 1], Die Wahrscheinlichkeit, dass das Testergebnis nicht tatsächlich mit dem Virus infiziert ist, wenn der Student ein Doktorand ist ** Negative Präzision **.

[^ 1]: Es ist nicht "positive / prädiktive Rate", sondern "positive / prädiktive Rate".

Wie wir sehen werden, variieren diese Werte stark in Abhängigkeit von der vorherigen Wahrscheinlichkeit.

Wenn Sie dies wie eine Kontinuitätstabelle schreiben, sieht es wie folgt aus [^ 4].

Wahrer Zustand
Betroffen Nicht betroffen
Inspektion
Inspektion
Schlussfolgerung
Ergebnis
Positiv $$ \begin{matrix} \ text {true positive} \\ \text{(true positive)} \\ \end{matrix} = a $$ $$ \begin{matrix} \ text {falsch positiv} \\ \text{(false positive)} \\ \end{matrix} = b $$ $$ \begin{matrix} \ text {Positiver Vorhersagewert} \\ \text{(positive precision)} \\ \end{matrix} = \frac{a}{a+b} $$
Negativ $$ \begin{matrix} \ text {falsch negativ} \\ \text{(false negative)} \\ \end{matrix} = c $$ $$ \begin{matrix} \ text {true negative} \\ \text{(true negative)} \\ \end{matrix} = d $$ $$ \begin{matrix} \ text {Negativer Vorhersagewert} \\ \text{(negative precision)} \\ \end{matrix} = \frac{d}{c+d} $$
$$ \begin{matrix} \ text {Empfindlichkeit} \\ \text{(sensitivity)} \\ \end{matrix} = \frac{a}{a+c} $$ $$ \begin{matrix} \ text {Singularität} \\ \text{(specificity)} \\ \end{matrix} = \frac{d}{b+d} $$

[^ 4]: Ich habe Probleme beim Ändern der Tabelle. Für einen Amateur ist es schwierig, sich mit Markdown zu ändern.

Positiver Vorhersagewert, negativer Vorhersagewert

Sensitivität = $ \ frac {a} {a + c} $ und Spezifität = $ \ frac {d} {b + d} $ und vorherige Wahrscheinlichkeit = $ \ frac {a + Angenommen, Sie erhalten c} {a + b + c + d} $. Wenn Sie die Gesamtzahl der Stichproben auf $ a + b + c + d = 1 $ setzen und den positiven Vorhersagewert und den negativen Vorhersagewert ermitteln,

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

Es wird [^ 3].

[^ 3]: Warum? Dieser Artikel Sie müssen nur die simultanen Gleichungen lösen.

Danach dieser Artikel Nehmen wir $ an und berechnen.

import matplotlib.pyplot as plt
import numpy as np

sensitivity = 0.70  #Empfindlichkeit eines Tests. Die Wahrscheinlichkeit, dass der Test positiv ist, wenn Sie betroffen sind.
specificity = 0.95  #Die Spezifität eines einzelnen Tests. Die Wahrscheinlichkeit, dass der Test negativ ist, wenn er nicht beeinflusst wird.

def positive_precision(prior_probability, sensitivity, specificity):
    '''
    Args:
        prior_probability:Vorwahrscheinlichkeit. Wahrscheinlichkeit, betroffen zu sein, wenn keine Voraussetzungen vorliegen.
        sensitivity:Empfindlichkeit. Wahrscheinlichkeit, beim Testen betroffener Patienten positiv zu sein.
        specificity:Singularität. Wahrscheinlichkeit, negativ zu sein, wenn nicht betroffene Patienten getestet werden.
    Returns:
        positive_precision:Positiv vorhergesagter Wert. Die Wahrscheinlichkeit, tatsächlich betroffen zu sein, wenn das Testergebnis positiv ist.
    '''
    return sensitivity * prior_probability / (sensitivity * prior_probability + (1 - specificity) * (1 - prior_probability))

def negative_precision(prior_probability, sensitivity, specificity):
    '''
    Args:
        prior_probability:Vorwahrscheinlichkeit. Wahrscheinlichkeit, betroffen zu sein, wenn keine Voraussetzungen vorliegen.
        sensitivity:Empfindlichkeit. Wahrscheinlichkeit, beim Testen betroffener Patienten positiv zu sein.
        specificity:Singularität. Wahrscheinlichkeit, negativ zu sein, wenn nicht betroffene Patienten getestet werden.
    Returns:
        negative_precision:Negativer Vorhersagewert. Die Wahrscheinlichkeit, dass Sie nicht betroffen sind, wenn das Testergebnis negativ ist.
    '''
    return specificity * (1 - prior_probability) / ((1 - sensitivity) * prior_probability + specificity * (1 - prior_probability))

Hier erhalten die Funktionen "positive_precision ()" und "negative_precision ()", wie der Name schon sagt, den positiven Vorhersagewert und den negativen Vorhersagewert aus der vorherigen Wahrscheinlichkeit, Empfindlichkeit und Singularität, die durch die Argumente gegeben sind.

Wenn Sie n-mal testen und alle n-mal negativ sind, denken Sie, dass es negativ ist

Mit anderen Worten, betrachten wir einen Fall, der auf der pessimistischen Denkweise basiert, dass Sie positiv sind, wenn Sie mehrmals testen und auch nur einmal ein positives Ergebnis erzielen. Zeichnen wir die vorherige Wahrscheinlichkeit und die Anzahl der Schecks $ n $ in der Grafik.

def sensitivity_pessimistic(sensitivity, n):
    '''
    Args:
        sensitivity:Empfindlichkeit eines Tests
        n:Anzahl der Inspektionen
    Returns:
Empfindlichkeit der n-fachen Inspektion:Die Empfindlichkeit des Tests gilt als negativ, wenn alle nach n Tests negativ sind
    '''
    return 1 - (1 - sensitivity) ** n

def specificity_pessimistic(specificity, n):
    '''
    Args:
        specificity:Spezifität eines Tests
        n:Anzahl der Inspektionen
    Returns:
Spezifität des n-Zeit-Tests:Die Spezifität des Tests wird als negativ angesehen, wenn alle nach n Tests negativ sind
    '''
    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('Inspektion{}Positiver Vorhersagewert zum Zeitpunkt der Implementierung'.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('Inspektion{}Negativer Vorhersagewert zum Zeitpunkt der Implementierung'.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('Prä-Morbiditätswahrscheinlichkeit')
ax.set_title('Genauigkeit mehrerer PCR-Tests(Negativ, wenn n-mal getestet und alle negativ)')
plt.show()

fig1.png

Diese pessimistische Vorstellung, dass "wenn Sie auch nur einmal ein positives Ergebnis erzielen, sind Sie krank", könnte der gegenwärtigen Denkweise in der Gesellschaft nahe kommen. Dies mag gut erscheinen, weil Sie auf der sicheren Seite sind, aber wenn die Vorwahrscheinlichkeit gering ist, können Sie eine große Anzahl von Menschen, die nicht wirklich betroffen sind, als betroffen behandeln. Krankenhäuser und Isolationseinrichtungen können punktiert und schwierig sein.

Zum Beispiel beträgt die Anzahl der bestätigten Infizierten in Japan [^ 2] bis heute (18. April 2020) mehr als 9.000, aber es gibt 100.000 ($ 10 ^ 5) $ echte Infizierte, was dem Zehnfachen dieser Zahl entspricht. Angenommen, Sie sind. Unter der Annahme, dass die Gesamtbevölkerung Japans 100 Millionen (10 ^ 8 ) beträgt, ist die Vorauswahrscheinlichkeit zufällig ausgewählter Personen $ \ text {vorherige Wahrscheinlichkeit} = \ frac {wahre Anzahl infizierter Personen} {Gesamtbevölkerung} = \ frac {10 ^ 5} {10 ^ 8} = 10 ^ {-3} $$ Und wie Sie in der obigen Grafik sehen können, wo die horizontale Achse $ 10 ^ {-3} $ beträgt, ist es keine Übertreibung zu sagen, dass es keinen Sinn macht, die Person zu inspizieren, die sie als Mist ausgewählt hat. Ist es zu viel zu sagen?

[^ 2]: Ich kenne die Definition nicht, aber es ist die von der lokalen Regierung angekündigte Anzahl, und es ist wahrscheinlich die Anzahl der Personen, die auch nur einmal im PCR-Test ** positiv ** wurden.

Im Fall eines Tests, der als positiv angesehen wird, wenn er n-mal getestet wird und alle n-mal positiv sind

Was ist als nächstes, wenn Sie sehr optimistisch denken, es in die entgegengesetzte Richtung schütteln und denken, wenn Sie einmal ein Negativ bekommen, denken Sie, dass es negativ ist. Zeichnen wir es in der Grafik, indem wir die vorherige Wahrscheinlichkeit und die Anzahl der Inspektionen $ n $ ändern.

def sensitivity_optimistic(sensitivity, n):
    '''
    Args:
        sensitivity:Empfindlichkeit eines Tests
        n:Anzahl der Inspektionen
    Returns:
Empfindlichkeit der n-fachen Inspektion:Empfindlichkeit eines Tests, der als positiv angesehen wird, wenn er n-mal getestet wird und alle n-mal positiv sind
    '''
    return sensitivity ** n

def specificity_optimistic(specificity, n):
    '''
    Args:
        specificity:Spezifität eines Tests
        n:Anzahl der Inspektionen
    Returns:
Spezifität des n-Zeit-Tests:Die Spezifität des Tests wird als positiv angesehen, wenn n-mal getestet werden und alle n-mal positiv sind
    '''
    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('Inspektion{}Positiver Vorhersagewert zum Zeitpunkt der Implementierung'.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('Inspektion{}Negativer Vorhersagewert zum Zeitpunkt der Implementierung'.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('Prä-Morbiditätswahrscheinlichkeit')
ax.set_title('Genauigkeit mehrerer PCR-Tests(N-mal getestet und positiv, wenn alle positiv sind)')
plt.show()

fig2.png

Auf diese Weise konnten wir durch mehrmaliges Testen die Wahrscheinlichkeit, positiv zu sein, erheblich erhöhen, selbst wenn die Vorwahrscheinlichkeit sehr gering war.

Wenn Sie hohes Fieber oder eine Lungenentzündung haben, ist es natürlich sehr sinnvoll zu testen, da Sie eine höhere Wahrscheinlichkeit haben, an COVID-19 zu erkranken. .. Dies liegt daran, dass die positive und die negative Rate hoch sind, unabhängig davon, welches der beiden obigen Diagramme aufgenommen wurde.

Zusammenfassung

Menschen, die auch nur einmal positiv getestet wurden, werden wahrscheinlich als infizierte Menschen behandelt, aber ich denke, dass normale Menschen noch nicht verurteilt sind, weil die Vorwahrscheinlichkeit nicht so hoch ist. Ich werde. In der tatsächlichen klinischen Umgebung ist es wahrscheinlich, dass Personen, die andere Symptome (Lungenentzündung, Geschmacks- und Geruchsstörungen usw.) untersuchen, zum Testen ausgewählt werden (= Personen mit einer ausreichend hohen vorherigen Wahrscheinlichkeit).

Wenn Sie aus dem Krankenhaus entlassen werden, scheinen Sie mehrere Male ordnungsgemäß PCR-Tests durchzuführen, und wenn es zweimal hintereinander negativ ist, werden Sie entlassen.

Ich weiß es nicht.

Ich habe das Jupyter-Notizbuch auf [github] gestellt (https://github.com/survivor7777777/covid-19/blob/master/PCR%20accuracy.ipynb). Es tut mir leid, wenn ich einen Fehler gemacht habe.

Recommended Posts

Wenn die Genauigkeit des PCR-Tests schlecht ist, warum nicht den Test wiederholen?
FAQ: Warum ist der Zahlenvergleich inkonsistent?
Der Wert von pyTorch torch.var () wird nicht verteilt
Was tun, wenn der Fortschrittsbalken in tqdm von Python nicht angezeigt wird?
Warum ist das erste Argument der [Python] -Klasse selbst?
[Golang] "package exec ist nicht in GOROOT" beim Ausführen des Tests
Testen Sie die Version des Argparse-Moduls
Ist die Niederschlagswahrscheinlichkeit korrekt?
Stellen Sie fest, ob die Zeichenfolge formatierbar ist
Stellen Sie fest, ob die Bibliothek installiert ist.
Wissenschaft "Ist Saito der Vertreter von Saito?"
Warum wird Kreuzentropie für die Zielfunktion des Klassifizierungsproblems verwendet?
Ich denke, die Grenze des Rucksacks ist nicht das Gewicht, sondern das Volumen w_11 / 22update