Estimar a probabilidade de que uma pessoa vacinada ainda infecte outras com Covid-19

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

[ad_1]

As eficiências estimadas da vacina dos ensaios clínicos de fase III fornecem boas informações de quão fortemente uma vacina Covid-19 reduz a probabilidade de uma infecção sintomática por Covid-19 no indivíduo vacinado, por exemplo, 95% para a vacina Biontech / Pfizer. No entanto, a probabilidade de que uma pessoa vacinada ainda seja infectada sem sintomas e possa infectar outras pessoas não vacinadas parece ainda amplamente desconhecida. Esse é um número importante, por exemplo, para decidir se ainda é legalmente defensável impor as mesmas restrições de fechamento a pessoas vacinadas e outras.

Bem, não sei como estimar esse número com os dados disponíveis publicamente. Ainda curioso, perguntei a mim mesmo como alguém poderia em princípio, estimar esse número se alguém tivesse dados de um aplicativo Corona de telefone celular que rastreia contatos anteriores e também armazenaria se um contato foi vacinado e, se não, provavelmente estava infectado com o vírus Corona no momento da reunião (que pode ser calculado a partir de resultados de teste de chegada posteriores). Eu não verifiquei a literatura existente, que pode ter abordagens muito melhores, mas apenas reorganizei algumas expressões matemáticas e executei a abordagem de estimativa resultante em dados simulados.

Vamos primeiro dar uma olhada no conjunto de dados simulado:

set.seed(1)
dat = simulate.meeting.data(init.sick.share=0.3,infect.prob = 0.1,
                            vipe=0.7,n=500000,m=1000000,
                            prob.unobserved = 0.1)
head(dat)
subjectid infetado m em mv
1 6 1 3
2 3 1
3 5 1 1
4 2 1
5 3 2
6 3 1

A variável dummy infected indica se durante um período considerado, o sujeito foi infectado com Covid-19. Cada linha corresponde a um sujeito não vacinado. A variável m deve ser o número de reuniões relevantes registradas antes da infecção. O número ms indica quantas dessas reuniões foram com uma pessoa não vacinada que tinha Covid-19. A variável mv indica o número de reuniões com uma pessoa que foi vacinada. Para os indivíduos vacinados com met não observamos se eles tinham ou não uma infecção Corona sem sintomas.

O código para o simulate.meeting.data função é fornecida no final deste post. Aqui está apenas uma breve descrição dos parâmetros especificados (eles não são calibrados para o mundo real):

  • init.sick.share=0.3 significa que 30% da população inicial está infectada com Corona. Para simplificar, presumimos que a população vacinada tem a mesma probabilidade de ser infectada, mas normalmente não apresenta sintomas. Você também pode interpretar uma pessoa vacinada infectada como uma pessoa que seria infectada se não tivesse sido vacinada.

  • infect.prob (10%) é a probabilidade de que uma pessoa infectada não vacinada infecte uma pessoa saudável não vacinada, uma vez que eles se encontram.

  • vipe (70%) deve representar o vaccine's infectiousness prevention efficacy. Este é o número que queremos estimar. Não sei o nome próprio para isso, então acabei de inventar um nome e gosto da abreviatura VIPE. Assumimos que uma pessoa vacinada infectada infecta em uma reunião com outra pessoa apenas com probabilidade infect.prob*(1-vipe).

  • n e m são o número de assuntos e o número de reuniões simuladas.

  • prob.unobserved (10%) é a probabilidade de que uma reunião não seja observada em nosso conjunto de dados. Reuniões não observadas ainda podem causar infecções.

Leia Também  Folha de dicas sobre inferência causal para cientistas de dados

Comecemos com algumas reflexões teóricas que nos ajudarão a estimar vipe. Usando uma notação matemática mais curta, vamos

[pi_s = text{infect.prob}]

ser a probabilidade de que uma pessoa infecciosa não vacinada infecte outra pessoa não vacinada desde que haja uma reunião. Deixei

[pi_v = text{infect.prob*(1-vipe)*init.sick.share}]

ser a probabilidade de que uma pessoa vacinada ($ pi_v $) que pode ter ou não uma infecção corona assintomática infecte uma pessoa não vacinada desde que eles se encontrem.

A probabilidade de que após o número registrado de reuniões $ m ^ s_i $ e $ m ^ v_i $ uma pessoa inicialmente saudável $ i $ seja infectada deve ser dada por:

[Pr(text{i infected})=1-(1-pi_v)^{m^v_i} cdot (1-pi_s)^{m^s_i} cdot U_i]

Isso é 1 menos a probabilidade de que nenhuma reunião leve a uma infecção. O termo $ U_i $ deve significar a probabilidade de infecções de reuniões que não são observadas em nosso conjunto de dados. Também assumimos que as probabilidades de infecção de todas as reuniões são independentes umas das outras.

O logaritmo da probabilidade de que uma pessoa vacinada inicialmente saudável $ i $ não seja infectada por nenhuma reunião, portanto, é

[log Pr(text{i not infected}) = log(1-pi_v) cdot m^v_i + log(1-pi_s) cdot {m^s_i} + log U_i]

Vamos renomear os termos do lado direito da seguinte forma:

[beta_1 = log(1-pi_v)]

[beta_2 = log(1-pi_s)]

onde $ beta_1 $ e $ beta_2 $ são coeficientes que iremos estimar. Nós também reescrevemos

[log U_i = beta_0 + u_i]

onde $ beta_0 $ é a média do log de probabilidade de se infectar em reuniões não observadas e $ u_i $ é um desvio não observável para cada indivíduo.

Podemos então escrever:

[log Pr(text{i not infected}) = beta_0 + beta_1 cdot m^v_i + beta_2 cdot {m^s_i} + u_i]

O lado direito se parece com o de uma bela equação de regressão linear. Infelizmente, o lado esquerdo contém uma probabilidade que não observamos diretamente. Um caminho a seguir poderia ser assumir uma distribuição para $ u_i $ (ou talvez até mesmo defini-la igual a 0), derivar a função de log da verossimilhança e calcular o estimador de Máxima Verossimilhança.

Leia Também  Grand Central Dispatch | R-bloggers

Ainda assim, escolho outra rota: agrego os dados de nível individual e, em seguida, executo uma regressão de mínimos quadrados ponderados.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
agg = dat %>%
  group_by(mv, ms) %>%
  summarize(
    n = n(),
    prob.infected = mean(infected),
    y = log(1-prob.infected)
  ) %>%
  ungroup()
head(agg)
mv em n prob.infected e
46300 0,01 -0,01
1 42400 0,11 -0,11
2 15900 0,19 -0,21
3 3960 0,28 -0,33
4 747 0,33 -0,4
5 117 0,48 -0,65

O quadro de dados agg contém uma linha para cada combinação de números de reunião mv e ms e nós calculamos em prob.infected a proporção média de pessoas infectadas em cada uma dessas células. Em seguida, usamos a variável y=log(1-prob.infected) como um estimador para o lado esquerdo em nossa especificação de regressão:

[y = beta_0 + beta_1 cdot m^v_i + beta_2 cdot {m^s_i} + u_i]

Agora estimamos essa regressão usando o quadro de dados agregados agg com o número de assuntos n em cada célula como pesos:

agg = filter(agg, is.finite(y))
reg = lm(y~mv+ms, data=agg, weights=agg$n)
beta = coef(reg)
beta

##  (Intercept)           mv           ms 
## -0.008729151 -0.009242340 -0.104527982

Os próprios coeficientes estimados não são muito informativos. Vamos agora convertê-los nas variáveis ​​de interesse:

names(beta) = NULL
pi.v = 1-exp(beta[2])
pi.s = 1-exp(beta[3])
init.sick.share = 0.3
vipe = 1-((pi.v/ init.sick.share) / pi.s) 
c(pi.s = pi.s, pi.v = pi.v, vipe = vipe)

##        pi.s        pi.v        vipe 
## 0.099250407 0.009199761 0.691025251

Estimamos uma probabilidade de 9,9% de ser infectado ao encontrar uma pessoa infectada não vacinada. Isso é próximo ao nosso parâmetro assumido infect.prob de 10%. Ao encontrar uma pessoa vacinada, estimamos apenas uma probabilidade de 0,9% de ser infectada. Observe que nossos dados não fazem distinção entre as pessoas vacinadas com uma infecção não observável e as não infectadas. Para estimar a eficácia da prevenção da infecção da vacina (VIPE), devemos, portanto, ajustar para a proporção de pessoas inicialmente infectadas. Obtivemos uma estimativa VIPE de 69,1%, que não está muito longe do verdadeiro valor de 70%. Erros padrão corretos podem (esperançosamente) ser obtidos por meio de bootstrap. Repeti a simulação 100 vezes e encontrei uma estimativa média para VIPE de 0,7002 com um desvio padrão de 0,02. Portanto, pelo menos com os dados simulados, essa abordagem de estimativa parece funcionar.

Leia Também  Advento de 2020, dia 30 - Monitoramento e solução de problemas do Apache Spark

Em um conjunto de dados do mundo real, seria necessário pensar sobre as possíveis fontes de viés, entretanto. Por exemplo, o comportamento e os procedimentos de segurança podem diferir sistematicamente, dependendo se a pessoa foi vacinada ou não. Também pode ser o caso de o número de reuniões não observadas estar correlacionado com características individuais que também são correlacionadas com as variáveis ​​explicativas, resultando em um problema clássico de endogeneidade em nossa regressão.

Mais importante ainda, não sei se existe um país que recolhe tais dados, permitiria analisá-lo e ao mesmo tempo tem bastantes casos Covid-19 para uma estimativa suficientemente precisa. Mas mesmo que a regressão apresentada nunca possa ser executada em dados reais, acho útil pensar sobre possíveis abordagens estatísticas para estimar essas medidas importantes. Por exemplo, pode ajudar a ponderar melhor os custos e benefícios de uma proteção de dados mais forte em comparação com percepções valiosas de mais coleta de dados.

No geral, estou curioso para saber se iremos aprender sobre o quão infecciosas são as pessoas vacinadas e qual conjunto de dados e abordagem empírica os estudos correspondentes farão …

Apêndice: Código de Simulação

simulate.meeting.data = function(
  init.sick.share = 0.2, # share of initially sick people
  infect.prob = 0.1, # probability 
  vipe = 0.7, # vaccine infection prevention efficacy
  vacc.share = 0.3, # share of vaccinated people
  prob.unobserved = 0, # probability that a meeting is unobserved
  n = 100000, # number of persons
  m = 100000 # number of meetings
) {
  # Draw persons that meet
  m1 = sample.int(n,2*m, replace=TRUE)
  m2 = sample.int(n,2*m, replace=TRUE)
  
  # Only keep first m meetings
  # where different persons meet
  keep = m1 != m2
  m1 = m1[keep][1:m]
  m2 = m2[keep][1:m]

  # Which persons are vaccinated
  vacc = (runif(n)  prob.unobserved

  # in every meeting let s be sender
  # and r be the receiver of a potential
  # infection
  # use dtplyr for speed
  library(dtplyr)
  dat = bind_rows(
    tibble(s = m1, r = m2, record=record),
    tibble(s = m2, r = m1, record=record)
    ) %>%
    filter(record) %>%
    mutate(
      start.sick.s = start.sick[s],
      start.sick.r = start.sick[r],
      post.sick.s = post.sick[s],
      post.sick.r = post.sick[r],
      infected = !start.sick.r & post.sick.r,
      vacc.s = vacc[s],
      vacc.r = vacc[r]
    ) %>%
    # only keep people that are initially sick
    filter(!start.sick.r) %>%
    # aggregate meeting data on person level
    lazy_dt() %>%
    group_by(r) %>%
    summarize(
      infected = 1L*first(infected),
      m = n(),
      ms = sum(start.sick.s & !vacc.s),
      mv = sum(vacc.s)
    ) %>%
    rename(subjectid = r) %>%
    as_tibble()
  dat
}



[ad_2]

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br