[PYTHON] Effiziente PCR-Inspektion nach Poolmethode

Einführung

Dieser Artikel ist ein Artikel eines bestimmten Asahi Shimbun Digital "Können Sie die Anzahl vieler Proben" gemeinsam "PCR-Tests erhöhen? Ich fand die in " beschriebene PCR-Testmethode interessant und veröffentlichte die Ergebnisse und Überlegungen verschiedener Experimente selbst. ** Ich habe keine Erfahrung mit dem PCR-Test selbst. Stellen Sie sich diesen Artikel als Gedankenexperiment in einer extrem idealisierten Situation vor. **

Was ist ein PCR-Test?

Was ist laut Wikipedia ein PCR-Test?

Eine Reihe von Reaktionen oder Techniken, die eine bestimmte Region aus einer DNA-Probe millionen- bis milliardenfach amplifizieren.

Unter Verwendung der Wirkung eines Enzyms namens DNA-Polymerase wird eine kleine Menge DNA durch eine Reihe von Temperaturänderungszyklen exponentiell (mauseal, verkettet) amplifiziert, um eine Kopie einer beliebigen Genregion oder Genomregion zu amplifizieren. Der Zweck besteht darin, die Probe auf eine ausreichende Menge zu amplifizieren, um ihre Details zu untersuchen.

Es ist eine Technik wie. Ich kann nichts über den speziellen Inhalt sagen, weil ich ein Außenseiter bin, aber es scheint, dass ein Test viel Zeit in Anspruch nimmt und viel kostet, weil ich dies für jeden Patienten mache.

Poolmethode PCR-Test

Laut dem oben erwähnten Artikel von Asahi Shimbun Digital

Wenn theoretisch auch nur eine der 500 Proben das Virus enthält, sollte die Nukleinsäure des Virus amplifiziert und positiv sein.

Wie Sie sehen, scheinen wir zu versuchen, die Effizienz zu verbessern, indem wir zuerst positive Proben treffen, indem wir mehrere Proben gleichzeitig testen, anstatt PCR-Tests einzeln durchzuführen. Was für eine Dynamik ** Ist das wirklich in Ordnung? Es fühlt sich an wie **, aber das Folgende kann aus der Beschreibung in diesem Artikel abgeleitet werden.

Wenn die positive Rate niedrig genug ist, ist es möglich, die Effizienz des PCR-Tests zu verbessern, indem die Mischung einmal getestet und dann einzeln erneut getestet wird, wenn sie positiv ist, anstatt einzeln zu testen. Ich denke. Es scheint, dass eine solche Methode ** Pool-Methode ** und so weiter heißt.

Problem Definition

Lassen Sie uns simulieren, wie effizient es tatsächlich sein kann. ** Ich denke, es gibt verschiedene Probleme in der Realität **, aber im Folgenden werde ich es vergessen und das Problem in einer extrem idealisierten Situation definieren. Angenommen, es werden * N * Proben erhalten. Angenommen, Sie möchten die folgenden Vorgänge ausführen, um festzustellen, ob alle Proben positiv sind **, und zwar mit möglichst wenigen Tests **.

Wenn Sie einen PCR-Test für alle Proben einzeln durchführen, können Sie den Test natürlich in * N * -Zeiten abschließen. Das Folgende ist eine Simulation, wie effizient Pooling sein kann.

Simulation

Die Probengröße * N = 100.000 *, die Anzahl der Proben * 1000 *, verschiedene Poolgrößen * M * und die positive Rate jeder Probe wurden für die Simulation eingestellt. Sehen wir uns das Ergebnis an, während der verwendete Python-Code angezeigt wird. Importieren Sie die erforderlichen Bibliotheken

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from numpy.random import rand

Stellen Sie verschiedene Parameter ein. (Hier wird der Fall einer positiven Rate von 0,01 gezeigt)

sample_number = 10**5 #Stichprobengröße
positive_rate = 0.01 #Positive Rate
sample_size = 1000 #Anzahl von Beispielen
#Kandidaten für die Zusammenlegung von Größen
pool_sizes = [2,3,4,5,8,10,15,20,25,50,75,100,200,500,1000,5000]

Hier definieren wir eine Funktion, die die Gesamtzahl der Prüfungen für die Stichprobe und die Poolgröße zurückgibt.

#Eine Funktion, die die Gesamtzahl der Prüfungen zurückgibt
def pcr(pool_size,sample):
#pool_size:Anzahl der Proben, die bei einer Inspektion zusammengefasst werden sollen
#sample:Stichprobe
    count=0
    count += (len(sample)+pool_size-1)//pool_size#Anzahl der Poolinspektionen
    count += len(np.unique(sample[0:-1:pool_size]))*pool_size#Erneut auf positives Pooling testen
    return count

Jetzt, da wir bereit sind, werden wir tatsächlich Daten mit Zufallszahlen generieren und experimentieren.

#Datengenerierung
samples = [np.insert((rand(sample_number)<positive_rate).cumsum(),0,0) for _ in range(sample_size)] 
#Cumsum zur Verbesserung der Effizienz der nachfolgenden Verarbeitung(Kumulative Summe)Nimmt
#Führen Sie eine Simulation durch und speichern Sie die Ergebnisse
rslt = dict()
for pool_size in pool_sizes:
    rslt[pool_size] = [pcr(pool_size,sample) for sample in samples]
rslt_binary[positive_rate] = [binary_pcr(sample) for sample in samples] 

Schließlich visualisiert ein Box-Whisker-Diagramm die Ergebnisse bei jeder Poolgröße.

#Zeichnen Sie die Box-Whisker
plt.rcParams["font.size"] = 18
points = tuple(rslt.values())
fig, ax = plt.subplots()
bp = ax.boxplot(points)
ax.set_xticklabels(tuple(rslt.keys()))
plt.title("Positive Rate"+str(int(100*positive_rate))+"%Im Falle von")
plt.xlabel("Poolgröße")
plt.xticks(rotation=45)
plt.ylabel("Gesamtzahl der Inspektionen")
plt.axhline(sample_number,color='black',ls='--')

Simulationsergebnis

Die Ergebnisse, wenn die positive Rate 1%, 5%, 10%, 30% beträgt, sind wie folgt. スクリーンショット 2020-07-15 0.37.25.png Sie können sehen, dass die Effizienz jedes Diagramms zunimmt, wenn die Poolgröße zuerst erhöht wird, aber wenn sie zu stark erhöht wird, nimmt die Effizienz ab. Wie Sie sehen können, kann die Poolgröße nicht zu groß oder zu klein sein, und es scheint einen optimalen Wert zu geben, der von der positiven Rate abhängt. Je kleiner die positive Rate jeder Probe ist, desto effizienter kann sie erwartet werden. Wenn die positive Rate 1% beträgt, ist ersichtlich, dass ein Maximum von ungefähr 20000 Tests für 100.000 Proben (ungefähr 5-mal) ausreicht. Effizienz). Wenn andererseits die positive Rate jeder Probe hoch ist, wurde bestätigt, dass das Pooling die Effizienz nicht verbessert und dass es weniger effizient ist als das Testen nacheinander.

Effizienterer Pooling-Größenalgorithmus

Gibt es eine Möglichkeit, die Inspektion effizienter durchzuführen? Bei der vorherigen Methode wurde die Poolgröße unabhängig vom Ergebnis der Inspektion in der Mitte festgelegt. Es scheint jedoch möglich zu sein, eine effizientere Inspektion durchzuführen, indem die Poolgröße entsprechend dem Inspektionsergebnis dynamisch geändert wird (z. B. zuerst). Nimmt eine große Poolgröße an und verringert dann die Poolgröße. Hier werden wir die Effizienz weiter verbessern, indem wir die Poolgröße dichotom ändern. Ich werde den spezifischen Algorithmus beschreiben.

  1. Teilen Sie die Probe in genau die Hälfte der ersten und der zweiten Hälfte (wenn es eine ungerade Zahl gibt, geben Sie den Bruch in die zweite Hälfte).
  2. Poolen und inspizieren Sie die erste Hälfte und die zweite Hälfte
  3. Über jede der ersten und zweiten Hälfte
  4. Wenn negativ, endet der Test
  5. Wenn positiv, in die erste und die zweite Hälfte teilen und von 2 wiederholen

Nennen wir diesen Algorithmus ** Bisection Pooling Test **. Beim zweiminütigen Pooling-PCR-Test ist es nicht erforderlich, zuerst die Pooling-Größe festzulegen, und der Test kann durchgeführt werden, während die Anzahl der Pools dynamisch geändert wird, indem die Probe jedes Mal gemäß dem Testergebnis in zwei Hälften gepoolt wird. Ich kann es schaffen Intuitiv scheint dies effizienter zu sein als das Festlegen der Poolgröße. Lassen Sie es uns implementieren. Der dichotome Pooling-Test kann mit einer rekursiven Funktion relativ sauber geschrieben werden.

def binary_pcr(sample):
   N = len(sample)
   if(N<=1): #Prüfen Sie ordnungsgemäß, ob weniger als eine Probe vorhanden ist
       return N
   if(sample[0] == sample[-1]): #Wenn der gepoolte negativ ist, werden keine weiteren Tests durchgeführt
       return 1
   #Andernfalls die linke und rechte Hälfte erneut mischen und prüfen
   return binary_pcr(spcm[:N//2]) + binary_pcr(spcm[N//2:])

Ergebnisse des zweiminütigen Pooling-Tests

Das Simulationsergebnis des Halbierungspooling-Tests ist wie folgt. bi.png

Sie können sehen, dass die Inspektion effizienter ist als die vorherige Methode, bei der die Poolgröße festgelegt wurde. (Insbesondere wenn die positive Rate 1% beträgt, beträgt die Gesamtzahl der Tests für 100.000 Proben weniger als 6000, sodass mit einer 16-fachen Effizienzsteigerung zu rechnen ist.)

Zusammenfassung

Simulationen haben bestätigt, dass die Anzahl kostspieliger PCR-Tests reduziert werden kann, indem PCR-Tests an den Proben zusammen in einer idealen Problemstellung durchgeführt werden. Bei der Methode, zuerst die Poolgröße festzulegen, ist es jedoch erforderlich, einen geeigneten Wert entsprechend der positiven Rate auszuwählen. Andererseits ist es beim Dichotomie-Pool-Test, der die Anzahl der Pools des nächsten Tests dynamisch anhand des Ergebnisses des Pool-Tests bestimmt, nicht erforderlich, über so etwas nachzudenken, und es ist eine hohe Leistung. Bei beiden Methoden ist der Wirkungsgrad umso höher, je niedriger die positive Rate ist.

Vorsichtsmaßnahmen

  1. ** Zunächst scheint es, dass PCR-Tests nach der Pool-Methode in Japan nicht als Hauptvoraussetzung durchgeführt werden **
  2. Erstens treten im PCR-Test mit einer bestimmten Wahrscheinlichkeit falsch positive und falsch negative Ergebnisse auf. Selbst wenn Sie die Poolmethode verwenden, können Sie keinen perfekten Test durchführen.
  3. In Wirklichkeit scheint die gepoolte Probe durch den Test zu rutschen.
  4. Die Annahme, dass Proben endlos gepoolt werden können, ist in der Realität ebenfalls ziemlich verdächtig.

In der Realität kann es einen Grund geben, warum nur Spezialisten und Fachleute verstehen können, warum wir keine PCR-Tests vom Pool-Typ durchführen.

Recommended Posts

Effiziente PCR-Inspektion nach Poolmethode
Primzahlbeurteilung durch Python
Zusammenfassung der Testmethode
Klassifizieren Sie Daten nach der k-means-Methode