[PYTHON] Inspection PCR efficace par méthode de pool

introduction

Cet article est un article d'un certain Asahi Shimbun Digital "Pouvez-vous augmenter le nombre de nombreux échantillons" collectivement "des tests PCR? J'ai pensé que la méthode de test PCR décrite dans " était intéressante, et j'ai posté les résultats et les considérations de diverses expériences par moi-même. ** Je n'ai aucune expertise dans le test PCR lui-même. Considérez cet article comme une expérience de pensée dans une situation extrêmement idéalisée. **

Qu'est-ce qu'un test PCR?

Selon Wikipedia, qu'est-ce qu'un test PCR?

Une série de réactions ou de techniques qui amplifient une région spécifique à partir d'un échantillon d'ADN des millions à des milliards de fois.

En utilisant l'action d'une enzyme appelée ADN polymérase, une petite quantité d'ADN est amplifiée de manière exponentielle (mouseally, enchaînée) à travers une série de cycles de changement de température pour amplifier une copie d'une région de gène arbitraire ou d'une région génomique. Le but est d'amplifier l'échantillon à une quantité suffisante pour en étudier les détails.

C'est une technique comme. Je ne peux rien dire sur le contenu spécialisé parce que je suis un étranger, mais il semble qu'un test prend beaucoup de temps, et cela coûte cher parce que je fais cela pour chaque patient.

Test PCR en piscine

Selon l'article Asahi Shimbun Digital mentionné ci-dessus

Théoriquement, si même un échantillon sur 500 contient le virus, l'acide nucléique du virus doit être amplifié et positif.

Il semble que nous essayons d'améliorer l'efficacité en frappant d'abord des échantillons positifs en testant plusieurs échantillons à la fois au lieu d'effectuer des tests PCR individuellement. Quelle dynamique ** Est-ce vraiment bien? Cela ressemble à **, mais ce qui suit peut être déduit de la description de cet article.

Si le taux positif est suffisamment bas, il est vrai que le test PCR peut être rendu plus efficace en testant le mélange une fois, puis en le retestant un par un s'il est positif, plutôt que de tester un par un. Je pense. Il semble qu'une telle méthode s'appelle ** méthode de pool ** et ainsi de suite.

Définition du problème

Simulons à quel point cela peut être efficace. ** Je pense qu'il y a différents problèmes dans la réalité **, mais dans ce qui suit, je vais l'oublier et définir le problème dans une situation extrêmement idéalisée. Supposons que * N * échantillons soient obtenus. Supposons que vous souhaitiez effectuer les opérations suivantes pour déterminer si tous les échantillons sont positifs ** avec le moins de tests possible **.

Évidemment, si vous effectuez un test PCR sur tous les échantillons un par un, vous pouvez terminer le test en * N * fois. Ce qui suit est une simulation de l'efficacité de la mise en commun.

simulation

La taille de l'échantillon était de * N = 100 000 *, le nombre d'échantillons de * 1 000 *, et diverses tailles de mise en commun * M * et le taux positif de chaque échantillon ont été définis pour la simulation. Voyons le résultat tout en montrant le code Python utilisé. Importez les bibliothèques requises

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

Définissez divers paramètres. (Ici, le cas du taux positif de 0,01 est montré)

sample_number = 10**5 #taille de l'échantillon
positive_rate = 0.01 #Taux positif
sample_size = 1000 #Le nombre d'échantillons
#Mise en commun des candidats de taille
pool_sizes = [2,3,4,5,8,10,15,20,25,50,75,100,200,500,1000,5000]

Ici, nous définissons une fonction qui renvoie le nombre total de contrôles pour l'échantillon et la taille du pool.

#Une fonction qui renvoie le nombre total de contrôles
def pcr(pool_size,sample):
#pool_size:Nombre d'échantillons à regrouper lors d'une inspection
#sample:échantillon
    count=0
    count += (len(sample)+pool_size-1)//pool_size#Nombre d'inspections de mise en commun
    count += len(np.unique(sample[0:-1:pool_size]))*pool_size#Retester la mise en commun positive
    return count

Maintenant que nous sommes prêts, nous allons générer des données avec des nombres aléatoires et expérimenter.

#Génération de données
samples = [np.insert((rand(sample_number)<positive_rate).cumsum(),0,0) for _ in range(sample_size)] 
#Cumsum pour améliorer l'efficacité du traitement ultérieur(Somme cumulée)Prends
#Effectuer une simulation et enregistrer les résultats
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] 

Enfin, un diagramme de moustaches de boîte visualise les résultats à chaque taille de regroupement.

#Tracez les moustaches de la boîte
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("Taux positif"+str(int(100*positive_rate))+"%dans le cas de")
plt.xlabel("Taille de la mise en commun")
plt.xticks(rotation=45)
plt.ylabel("Nombre total d'inspections")
plt.axhline(sample_number,color='black',ls='--')

résultat de la simulation

Les résultats lorsque le taux positif est de 1%, 5%, 10%, 30% sont les suivants. スクリーンショット 2020-07-15 0.37.25.png Vous pouvez voir que l'efficacité de chaque graphique augmente lorsque la taille du pool est augmentée au début, mais lorsqu'elle est trop augmentée, l'efficacité diminue. Comme vous pouvez le voir, la taille de la mise en commun ne peut pas être trop grande ou trop petite, et il semble y avoir une valeur optimale en fonction du taux positif. De plus, plus le taux positif de chaque échantillon est petit, plus on peut s'attendre à ce qu'il soit efficace, et lorsque le taux positif est de 1%, on peut voir qu'un maximum d'environ 20000 tests est suffisant pour 100000 échantillons (environ 5 fois). Efficacité). En revanche, lorsque le taux positif de chaque échantillon était élevé, il a été confirmé que la mise en commun ne serait pas très efficace et qu'elle serait moins efficace que les tests un par un.

Algorithme de dimensionnement de pool plus efficace

Existe-t-il un moyen d'effectuer l'inspection plus efficacement? Dans la méthode précédente, la taille du regroupement était fixée quel que soit le résultat de l'inspection au milieu, mais il semble qu'il soit possible d'inspecter plus efficacement en modifiant dynamiquement la taille du regroupement en fonction du résultat de l'inspection (par exemple, d'abord). Prend une grande taille de mise en commun, puis diminue la taille de mise en commun). Ici, nous allons encore améliorer l'efficacité en modifiant la taille de la mise en commun de manière dichotomique. Je décrirai l'algorithme spécifique.

  1. Divisez l'échantillon en exactement la moitié de la première moitié et la seconde moitié (s'il y a un nombre impair, mettez la fraction dans la seconde moitié)
  2. Regroupez et inspectez respectivement la première moitié et la seconde moitié
  3. À propos de la première moitié et de la seconde moitié
  4. Si négatif, le test se termine
  5. S'il est positif, divisez en première moitié et en seconde moitié et répétez à partir de 2

Appelons cet algorithme ** test de regroupement de bisection **. Dans le test PCR de regroupement de deux minutes, il n'est pas nécessaire de fixer d'abord la taille du regroupement, et le test peut être effectué tout en modifiant dynamiquement le nombre de regroupement en regroupant l'échantillon par deux en fonction du résultat du test à chaque fois. Je peux le faire. Intuitivement, cela semble être plus efficace que de fixer la taille de la mise en commun. Mettons-le en œuvre. Le test de regroupement dichotomique peut être écrit de manière relativement nette en utilisant une fonction récursive.

def binary_pcr(sample):
   N = len(sample)
   if(N<=1): #Inspectez correctement s'il y a moins d'un échantillon
       return N
   if(sample[0] == sample[-1]): #Si la mise en commun est négative, aucun autre test
       return 1
   #Sinon, mélangez à nouveau dans les moitiés gauche et droite et inspectez
   return binary_pcr(spcm[:N//2]) + binary_pcr(spcm[N//2:])

Résultats du test de mise en commun de deux minutes

Le résultat de la simulation du test de regroupement de bissection est le suivant. bi.png

Vous pouvez voir que l'inspection est plus efficace que la méthode précédente où la taille de regroupement était fixée. (Surtout lorsque le taux positif est de 1%, le nombre total de tests est inférieur à 6000 pour 100000 échantillons, on peut donc s'attendre à ce que l'efficacité augmente d'environ 16 fois.)

Résumé

Les simulations ont confirmé que le nombre de tests PCR coûteux peut être réduit en effectuant des tests PCR sur des échantillons d'un lot dans un contexte de problème idéal. Cependant, dans la méthode de fixation de la taille du pool en premier, il est nécessaire de sélectionner une valeur appropriée en fonction du taux positif. En revanche, dans le test de pool de dichotomie, qui détermine dynamiquement le nombre de pooling du test suivant en fonction du résultat du test groupé, il n'est pas nécessaire de penser à une telle chose et c'est de haute performance. Dans les deux méthodes, plus le taux positif est bas, plus le degré d'efficacité est élevé.

Remarques

  1. ** Tout d'abord, il semble que les tests PCR par la méthode du pool ne sont pas effectués au Japon comme une prémisse majeure **
  2. En premier lieu, les faux positifs et les faux négatifs apparaissent dans le test PCR avec une certaine probabilité, donc même si vous utilisez la méthode du pool, vous ne pouvez pas effectuer un test parfait.
  3. En réalité, il semble que l'échantillon groupé puisse passer à travers le test.
  4. L'hypothèse selon laquelle les échantillons peuvent être regroupés à l'infini est également assez suspecte en réalité.

En réalité, il peut y avoir une raison pour laquelle seuls les spécialistes et les personnes dans le domaine peuvent comprendre pourquoi nous ne réalisons pas de tests PCR de type piscine.

Recommended Posts

Inspection PCR efficace par méthode de pool
Jugement des nombres premiers par Python
Résumé de la méthode d'essai
Classer les données par la méthode k-means