Faça a caminhada | R-bloggers

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


[This article was first published on R on kieranhealy.org, and kindly contributed to R-bloggers]. (Você pode relatar problemas sobre o conteúdo desta página aqui)


Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.

Outro dia, eu estava tentando fazer um monte de gráficos mostrando alguns dados recentes do CDC sobre o excesso de mortalidade devido ao COVID-19. A ideia era fazer contagens semanais de mortes nos últimos anos, tanto no geral quanto por várias causas importantes, e então mostrar como as contagens semanais deste ano se comparam até agora. Os Estados Unidos têm uma população muito grande, o que significa que um número bastante previsível de pessoas morre a cada semana. Ao longo de um ano, o número médio de pessoas que deveriam morrer muda. Mais pessoas morrem em média no inverno do que no verão, por exemplo. Quanto menor a população, mais ruidoso ficará, mas, no geral, a maioria dos estados dos EUA é grande o suficiente para ter uma expectativa bastante estável de mortes por semana. Alguns condados ou cidades também. No geral, nossas expectativas para qualquer grande população serão razoavelmente estáveis ​​- sem, é claro, um choque como a chegada de um novo vírus.

Riscos concorrentes

A estimativa adequada do excesso de mortalidade não é apenas uma questão de ler a diferença entre o número médio de pessoas que morrem em um determinado período e o número que morrem em algum período de interesse onde as condições mudaram. As pessoas só podem morrer uma vez. Se alguém morre de COVID-19, por exemplo, não está mais em condições de morrer de doença cardíaca ou complicações do diabetes ou alguma outra causa. Se não tivessem morrido de COVID-19, algumas vítimas da doença teriam falecido por uma dessas outras causas durante o ano. Este é o problema de riscos concorrentes, um membro da família de problemas decorrentes de dados censurados. As causas da morte “competem”, por assim dizer, pela vida de cada pessoa. Em qualquer caso particular, se um deles “ganhar”, então essa pessoa não estará mais lá para ser reivindicada por uma das outras causas potenciais mais tarde. Como questão de estimativa, o problema foi reconhecido pelo menos desde 1760, quando Daniel Bernoulli tentou avaliar os benefícios da inoculação contra a varíola. Em seu esforço para descobrir a quantidade de vidas contrafactuais que teriam sido perdidas na ausência da inoculação, Bernoulli usou o que hoje chamaríamos de tabela de chances de morte em qualquer idade. Sendo a ciência o empreendimento relativamente compacto que era no século XVIII, aquela mesa havia sido construída com base em “curiosas tabelas de nascimentos e funerais na cidade de Breslaw” [i.e. Breslau, or Wrocław] pelo astrônomo inglês Edmond Halley.

O problema é sutil, com consequências para a interpretação das taxas de mortalidade. Por exemplo, na esteira de uma epidemia que mata muitas pessoas, a mortalidade média pode diminuir em grupos específicos ou na população como um todo, simplesmente porque alguns daqueles que (contrafactualmente) corriam maior risco de morrer como parte do fluxo ordinário de eventos e da passagem do tempo, em vez disso (de fato) acabam sendo vítimas mais ou menos ao mesmo tempo da epidemia.

Leia Também  Cadernos R para nnetsauce | R-bloggers

Eu deixo de lado essas complicações aqui. Tudo que eu queria fazer era mostrar o prime facie evidências de que houve um aumento claro e repentino no número de mortes após a chegada do COVID-19 aos Estados Unidos. A divisão precisa de quaisquer efeitos supressores nas taxas de mortalidade de outras causas é, de certa forma, um problema secundário. A gravidade do COVID-19 é claramente visível tanto no aumento da mortalidade por todas as causas que começa repentinamente em março, quanto nas mudanças incomuns nas taxas de mortalidade de outros casos também. Como podemos ver nos gráficos, COVID-19 foi um grande choque na margem das taxas de mortalidade, não algum tipo de sinal sutil que precisamos trabalhar duro para descobrir e tornar visível nos dados.

Aqui estão alguns exemplos do enredo que acabei fazendo. Estes são os Estados Unidos como um todo:

Evidência de excesso de mortalidade este ano nos Estados Unidos

Evidência de excesso de mortalidade este ano nos Estados Unidos

E esta é a cidade de Nova York:

Evidência de excesso de mortalidade este ano na cidade de Nova York

Evidência de excesso de mortalidade este ano na cidade de Nova York

Você pode ver o restante deles por meio da postagem original.

O painel superior mostra a contagem bruta de mortalidade por todas as causas para o ano até agora (em vermelho) em comparação com as tendências semanais para cada um dos cinco anos anteriores. Este painel é um bom exemplo de como a regra de ouro que diz “Comece seu eixo y no zero” é de fato apenas uma regra de ouro e não uma lei da natureza. A comparação relevante aqui é com o número de pessoas que normalmente morrem nos Estados Unidos a cada semana, em comparação com este ano. Ninguém pensa que há semanas em que nenhuma pessoa morre. Em vez disso, as linhas cinzas fornecem a linha de base (com o tamanho da contagem mostrado no eixo y). Também seria razoável mostrar que se trata de uma mudança percentual em vez de absoluta, mas acho que, neste caso, o melhor lugar é começar, para a mortalidade geral, é com as contagens brutas. Os painéis inferiores, por sua vez, apresentam dez diferentes causas de morte e mostram a tendência em contagens brutas (nos gráficos de linha à esquerda) e o grau em que essas causas foram desequilibradas em termos relativos (na barra gráficos à direita). Mais uma vez, o terrível impacto da pandemia é imediatamente evidente. As comparações por causa são muito interessantes. Uma linha de base útil é a taxa de mortalidade por câncer, que quase não mudou de sua magnitude típica. Enquanto isso, a taxa de mortes por doenças cardíacas, Alzheimer, diabetes e pneumonia está muito acima da média. Somam-se, note-se, os óbitos registrados diretamente no COVID-19, que nesses dados somam cerca de 190 mil, até o início de setembro. Nem todas as mortes adicionais nas outras causas são atribuíveis a coisas conectadas a COVID, já que algumas dessas pessoas teriam morrido de qualquer maneira. Mas acho que está claro que o excesso de mortalidade associado à pandemia é substancialmente maior do que a contagem de causa única de mortes por COVID-19.

Leia Também  Webtool do Estudo Eleitoral da Nova Zelândia por @ ellis2013nz

Fazendo os gráficos

Cada figura é composta por quatro peças. Montá-los de maneira elegante é muito mais fácil com o pacote de patchwork de Thomas Lin Pedersen. Digamos que tenhamos feito nossa limpeza de dados e cálculos em nossos dados iniciais e agora temos uma tabela, df, que se parece em parte com isto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
> df %>% select(jurisdiction, year, week, cause, n, pct_diff)
# A tibble: 185,991 x 6
   jurisdiction  year  week cause                                  n pct_diff
                                               
 1 Alabama       2015     1 All Cause                           1139     1.79
 2 Alabama       2015     1 Alzheimer's                           59     4.75
 3 Alabama       2015     1 Cerebrovascular Diseases              48   -15.  
 4 Alabama       2015     1 Chronic Lower Respiratory Diseases    73    -4.93
 5 Alabama       2015     1 Diabetes                              36    17.2 
 6 Alabama       2015     1 Diseases of the Heart                273    -3.44
 7 Alabama       2015     1 Influenza and Pneumonia               48    30   
 8 Alabama       2015     1 Cancer                               200    -3   
 9 Alabama       2015     1 Kidney Diseases                       26    21.5 
10 Alabama       2015     1 Other Respiratory disease             30    32.  
# … with 185,981 more rows

Esta é uma tabela de números semanais de mortes por cada uma das onze causas para cada uma das 54 jurisdições durante cinco anos. o pct_diff coluna mostra o quanto uma causa específica naquela semana naquela jurisdição diferiu de sua média de 2015-2019.

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

Por conveniência, também temos uma tabela com os nomes de nossas 54 jurisdições e criamos uma coluna chamada fname que usaremos mais tarde ao salvar cada gráfico como um arquivo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
states % 
  select(jurisdiction) %>% 
  unique() %>%
  mutate(fname = tolower(paste0("figures/", jurisdiction, "_patch")), 
         fname = stringr::str_replace_all(fname, " ", "_"))

> states
# A tibble: 54 x 2
   jurisdiction         fname                             
                                                
 1 Alabama              figures/alabama_patch             
 2 Alaska               figures/alaska_patch              
 3 Arizona              figures/arizona_patch             
 4 Arkansas             figures/arkansas_patch            
 5 California           figures/california_patch          
 6 Colorado             figures/colorado_patch            
 7 Connecticut          figures/connecticut_patch         
 8 Delaware             figures/delaware_patch            
 9 District of Columbia figures/district_of_columbia_patch
10 Florida              figures/florida_patch             
# … with 44 more rows

O que fazemos a seguir é escrever algumas funções que desenham os gráficos que desejamos. Teremos um para cada parcela. Por exemplo, aqui está uma versão ligeiramente simplificada do patch_state_count() função que desenha o painel superior, aquele que mostra a contagem da mortalidade por todas as causas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
patch_state_count % 
  filter(jurisdiction %in% state, cause == "All Cause") %>%
  group_by(year, week) %>% 
  mutate(yr_ind = year %in% 2020) %>%
  filter(!(year == 2020 & week > 30)) %>%
  ggplot(aes(x = week, y = n, color = yr_ind, group = year)) + 
  geom_line(size = 0.9) + 
  scale_color_manual(values = c("gray70", "firebrick"), labels = c("2015-2019", "2020")) +
  scale_y_continuous(labels = scales::comma) +
  labs(x = NULL, 
       y = "Total Deaths", 
       color = "Years",
       title = "Weekly recorded deaths from all causes", 
       subtitle = "2020 data are for Weeks 1 to 30. Raw Counts.") 
  
  out

}


Essas funções não são de uso geral. Eles dependem de uma tabela específica (df) e algumas outras coisas que sabemos que estão presentes em nosso ambiente de trabalho. Escrevemos funções semelhantes para os outros três tipos de plotagem. Chame-os patch_state_covid(), patch_state_cause(), e patch_state_percent(). Dê a qualquer um deles o nome de um estado e ele desenhará o gráfico solicitado para aquele estado.

Em seguida, escrevemos uma função de conveniência para montar cada um dos patches em uma única imagem. Novamente, este é um pouco simplificado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
make_patchplot 

A tremenda flexibilidade do pacote de patchwork faz todo o trabalho aqui. Nós apenas imaginamos cada uma de nossas funções como fazer um enredo e montá-lo de acordo com as regras do patchworks, onde / significa uma nova linha e + adiciona um gráfico próximo ao que estiver na linha atual. Patchwork’s plot_layout() função nos permite especificar as alturas relativas dos painéis, e seus plot_annotation() A função permite adicionar títulos e legendas globais ao gráfico como um todo, da mesma forma que faríamos para um ggplot individual.

Leia Também  Ciência de dados é uma ciência (não aquela que você pode pensar)

Nesta fase, estamos no ponto em que escrever, digamos, make_patchplot("Michigan") irá produzir um bom gráfico de várias partes para esse estado. Resta fazer isso para todas as jurisdições. Existem várias maneiras de fazer isso, dependendo do que mais tivermos em mente para as parcelas. Poderíamos apenas escrever um for() loop que itera sobre os nomes das jurisdições, faz um gráfico para cada uma e salva em disco. Ou poderíamos usar map() e algumas de suas relações para alimentar o nome de cada jurisdição para nosso make_patchplot() função e agrupar os resultados em uma tabela. Como isso:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
out_patch % 
  mutate(patch_plot = map(jurisdiction, make_patchplot))

> out_patch
# A tibble: 54 x 3
   jurisdiction         fname                              patch_plot
                                                     
 1 Alabama              figures/alabama_patch              
 2 Alaska               figures/alaska_patch               
 3 Arizona              figures/arizona_patch              
 4 Arkansas             figures/arkansas_patch             
 5 California           figures/california_patch           
 6 Colorado             figures/colorado_patch             
 7 Connecticut          figures/connecticut_patch          
 8 Delaware             figures/delaware_patch             
 9 District of Columbia figures/district_of_columbia_patch 
10 Florida              figures/florida_patch              
# … with 44 more rows

Arrumado! Pegamos nosso pequeno states tibble de cima e adicionou uma nova coluna de lista a ele. Cada row é um enredo totalmente composto, sentado lá esperando que façamos algo com ele. Você pode, é claro, fazer algo equivalente na Base R com lapply().

O que faremos com isso é salvar um PDF de cada plotagem. Vamos usar ggsave() por isso. Ele precisará saber o nome do arquivo que estamos criando e o objeto que contém o gráfico correspondente. Para passar essa informação adiante, poderíamos usar map() novamente. Ou, mais silenciosamente, podemos usar walk(), que é o que você faz quando deseja apenas percorrer uma lista, alimentando os elementos da lista, um de cada vez, com uma função para produzir algum efeito colateral (como salvar um arquivo) em vez de retornar algum valor ou número que você quer fazer outra coisa com.

Para criar um arquivo nomeado para cada jurisdição e fazer com que ele realmente contenha o lote que precisamos fornecer dois argumentos: o nome do arquivo e o próprio gráfico. Montamos um nome de arquivo válido usando o fname coluna de out_patch. O enredo está no patch_plot coluna. Quando precisamos mapear dois argumentos para uma função desta forma, usamos map2() ou sua contraparte walk2().

1
2
3
4
5
6
7
walk2(paste0(out_patch$fname, ".pdf"), 
     out_patch$patch_plot, 
     ggsave, 
     height = 16, width = 9)
     

O primeiro argumento cria o nome do arquivo, por exemplo, "figures/alabama_patch.pdf". O segundo é o lote correspondente para aquela jurisdição. A função para a qual alimentamos esses dois bits de informação é ggsave, e também transmitimos um height e width instrução. Esses serão os mesmos para cada lote.

O resultado final é um figures/ pasta com cinquenta e quatro arquivos PDF. O repositório GitHub que acompanha o post anterior fornece o código para reproduzir as etapas aqui, assumindo que você tenha o pacote covdata instalado (para os dados de mortalidade do CDC) junto com as ferramentas tidyverse usuais e, claro, o pacote patchwork.



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