Como comparar dados de ensaios clínicos com um controle de história natural


8

Contexto: estou interessado em entender como analisar dados de ensaios clínicos com controle de história natural, ou seja, um ensaio clínico em que um grupo de pessoas (digamos, pessoas com risco genético para uma doença) é recrutado, todas elas são tratadas com uma droga e sua sobrevivência (por exemplo, idade de início da doença ou morte devido a essa doença) é comparada à sobrevivência de controles históricos não tratados com o mesmo risco genético.

Antes de começar, quero apenas reconhecer que li os documentos de orientação da FDA (por exemplo, doenças raras: problemas comuns no desenvolvimento de medicamentos ) sobre este tópico e estou bem ciente de que existem muitos tipos de preconceitos que podem se infiltrar na natureza. comparações da história e que, por esse motivo, a FDA raramente aceita esses ensaios como evidência da eficácia de um medicamento, em vez de considerar os ensaios randomizados como evidência muito mais forte. A questão de como determinar se uma coorte de história natural pode ser comparada de maneira justa com uma coorte prospectiva tratada com um medicamento é uma questão importante e complexa. Mas esse não é o tópico da minha pergunta hoje. Em vez disso, estou descobrindo que estou perplexo com uma questão ainda mais simples, a questão de seuma coorte de história natural é considerada comparável e imparcial e assim por diante; então , como , estatisticamente falando, é possível fazer a comparação?

Então, aqui está um cenário.

  • Por uma questão de simplicidade, digamos que minha doença tem uma causa genética conhecida e única, e as pessoas com esse genótipo são perfeitamente saudáveis ​​até alguma idade e, de repente, ficam muito doentes. A idade de início da doença é altamente variável e o risco varia em função da idade. Todos em todos os conjuntos de dados descritos abaixo possuem esse genótipo causador de doença.
  • No conjunto de dados A, tenho dados de pessoas em um ensaio clínico hipotético. Eles se matricularam em uma idade ( starting_age), foram tratados com um medicamento e foram seguidos por um período variável de tempo até uma segunda idade ( last_age) na qual adoeceram ( event == 1) ou se retiraram do estudo ( event == 0).
  • Em um cenário "ideal ideal", talvez a coorte de história natural seja um grande número de pessoas com esse genótipo, seguidas desde o nascimento até a morte desta doença ou de uma causa não relacionada. Esse tipo de conjunto de dados não existe. Em vez disso, considere duas opções possíveis para o que poderia ser a coorte de história natural (B e C) ...
  • No conjunto de dados B, tenho dados de pessoas que se inscreveram em um estudo prospectivo em alguma idade aleatória ( starting_age), não foram tratadas com nenhum medicamento e foram simplesmente seguidas por um período variável de tempo até uma segunda idade ( last_age) na qual elas se tornaram doente ( event == 1) ou retirou-se do estudo ( event == 0). Não se pode presumir que a distribuição das idades iniciais e o número de anos de acompanhamento sigam as mesmas distribuições que no conjunto de dados A.
  • No conjunto de dados C, tenho dados puramente retrospectivos; aqui não houve acompanhamento prospectivo. Simplesmente observamos cada pessoa uma vez. Observou-se que algumas pessoas adoeciam em uma idade específica ( age, e event == 1), enquanto outras ainda eram saudáveis ​​em alguma idade específica ( age, e event == 0).

Se eu entender a terminologia corretamente, os dados em A e B serão considerados truncados à esquerda e censurados à direita; os dados em C seriam considerados apenas censurados à direita. De acordo com os termos usados ​​em Caim 2011 , acredito que o conjunto de dados B é uma "coorte prevalente", enquanto o conjunto de dados C é uma "coorte incidente".

Minhas perguntas são:

  1. Como (se é que existe) alguém pode construir uma função de sobrevivência (ou uma função de risco, etc.) para o conjunto de dados A ou B, dado que os dados são deixados truncados em diferentes idades para cada indivíduo?
  2. Que teste estatístico (ou método de bootstrapping) seria usado para testar se as pessoas no conjunto de dados A sobrevivem significativamente mais tempo ou apresentam riscos significativamente menores do que aqueles em B ou C?
  3. Se tudo o que você tinha era o conjunto de dados B ou C e você queria estimar o poder estatístico de um determinado ensaio clínico com N indivíduos para uma determinada taxa de risco, como você o faria?
  4. (Pergunta bônus) se as pessoas também tivessem, digamos, diferentes mutações genéticas associadas a diferentes perigos em função da idade, como você incorporaria essa variável nas respostas acima?

Algumas coisas que eu tentei até agora:

  • Eu considerei a estatística Z de Flora [ Flora 1978 ], que alguns aplicaram em situações semelhantes, mas estou preocupado que ela não explique a variação da amostra na coorte da história natural sendo usada como referência.
  • Pesquisei no Google algumas combinações diferentes de termos, como análise de sobrevivência com diferentes tempos de truncamento à esquerda, e encontrei algumas páginas que discutem problemas semelhantes, como Análise de Sobrevivência: Dados Truncados à Esquerda , Sobrevivendo ao Truncamento Esquerdo usando o PROC PHREG , mas estes não explicaram o subjacente matemática de sua solução.
  • Finalmente cheguei a Caim 2011, que discute a questão em detalhes e, útil, tem o código R para lidar com o truncamento esquerdo no suplemento . Eles implementaram a sua própria função para um incorporando-truncamento deixou MLE, mas a alegação é que-truncamento esquerda já pode ser tratado em um modelo de riscos proporcionais de Cox utilizando a funcionalidade embutida no R survivalbiblioteca, por exemplo: coxph(Surv(time=agestart,time2=x,event=cx,type='counting')~bmi). Aqui, um Survobjeto é criado usando timea idade inicial e time2a idade em eventque ocorreu ou não. Isso parece sensato, embora o arquivo de ajuda para Survnão explique o que realmente está fazendo aqui - por exemplo, não explica o que o countingmodelo implica. Eu virei para o survivalmanuale, como referência counting, fui apontado para Andersen & Gill 1982, que por sua vez estava um pouco acima da minha cabeça e não parece discutir o truncamento esquerdo, ou pelo menos não com esse nome. Uma peculiaridade é que o modelo de "contagem" parece construído para se ajustar a casos em que um indivíduo pode ter vários eventos em sua vida, o que não é o caso no meu exemplo, mas talvez isso não importe.
  • Com base no exposto, parecia que um modelo de "contagem" de Cox poderia ser o caminho certo para comparar o conjunto de dados A e B, e eu pude fazer essa comparação no R (veja o código abaixo), embora ainda esteja lutando para entender se Estou fazendo a coisa certa aqui e não tenho certeza de como (se é que existe) essa abordagem poderia ser aplicada para comparar o conjunto de dados A a C.
  • Por fim, procurei o Cross Validated em busca de truncamento à esquerda e encontrei um grande número de casos em que as pessoas fizeram perguntas semelhantes às minhas ( 1 , 2 , 3 , 4 , 4 , 4 , 5 , 6 , 7 ), mas a maioria não teve resposta; um apontou para a referência de Caim acima e outro apontou para Klein & Moeschberger 2003 o que foi útil (ver p. 123 e p. 312) e parece apoiar a noção de que A e B podem ser comparados usando uma abordagem bastante simples de Cox, embora não atenda à comparabilidade de A a C, nem à questão do cálculo de potência (no entanto, se a pergunta do teste estatístico for respondida, presumivelmente eu poderia chegar ao poder com algumas instruções de inicialização).

Abaixo estão alguns dados hipotéticos em R ilustrando esse cenário. Incluí 20 linhas para cada conjunto de dados, embora, caso isso importe, no cenário da vida real que estou imaginando, os conjuntos de dados A e B talvez estejam na ordem de 50 ou 100 pacientes, e o conjunto de dados C esteja na ordem de 500 ou 1.000 pacientes.

# A) hypothetical data from clinical trial
data_a = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
1|33|42|0
2|45|49|0
3|47|52|1
4|30|34|0
5|37|44|0
6|34|37|0
7|29|34|0
8|58|66|0
9|58|60|0
10|66|75|0
11|37|41|0
12|37|46|0
13|58|62|0
14|44|48|1
15|45|50|0
16|56|65|0
17|54|63|0
18|36|41|0
19|47|55|1
20|45|55|0
"))

# B) hypothetical data from a prospective natural history study
data_b = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
101|19|28|0
102|39|52|0
103|38|41|1
104|18|27|0
105|20|24|0
106|16|20|0
107|39|41|0
108|48|50|0
109|40|50|0
110|38|41|1
111|40|43|1
112|26|29|0
113|37|39|0
114|21|30|0
115|36|41|1
116|46|48|0
117|27|32|0
118|26|29|0
119|29|38|0
120|47|58|0
"))


# C) hypothetical data from a retrospective natural history study
data_c = read.table(sep='|',header=T,textConnection("
indiv_id|age|event
201|43|1
202|53|1
203|64|1
204|45|1
205|88|1
206|70|1
207|66|1
208|55|1
209|51|1
210|48|1
211|63|1
212|36|0
213|61|0
214|63|1
215|63|1
216|57|1
217|74|0
218|63|1
219|59|1
220|57|1
"))


# one possible approach to compare A and B using Cox counting model
data_a$drug = TRUE
data_b$drug = FALSE
nh_compare = rbind(data_a, data_b)
m = survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)
summary(m)
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

Nota final: como é necessária uma reputação de 10 para postar> 2 links no Cross Validated, removi todos os (muitos) hiperlinks que deveriam aparecer acima. Uma versão deste post com links está disponível no meu blog e atualizarei este post para incluir os links se ou quando tiver permissão para fazê-lo. Atualização: obrigado a todos que votaram! Agora tenho reputação> 10 e atualizei este post para incluir links.


Quando você diz "retirou-se da avaliação" em sua pergunta, poderia importar se a retirada representava simplesmente o final da coleta de dados para a avaliação ou se era devido a efeitos colaterais inaceitáveis ​​etc. Também no seu conjunto de dados A, quantos eventos existem?
EdM

@ EdM Eu acho que todos os itens acima. As retiradas podem incluir final do julgamento, retirada de eventos adversos, mortes devido a causas não relacionadas e pessoas que perderam o interesse por qualquer motivo (incluindo desconhecido / perdido no acompanhamento). Por uma questão de simplicidade, acho que podemos razoavelmente assumir que a retirada é independente do resultado de interesse (isto é, a retirada não é desencadeada pelo início da doença). Quanto ao conjunto de dados A, acho que depende da taxa de risco. Se o medicamento for muito eficaz, pode não haver eventos. Se sua pergunta é quantos eventos por pessoa, a resposta é que cada pessoa pode ter no máximo um evento, sempre.
ericminikel

essa é uma pergunta longa. tem certeza de que não pode ser dividido em perguntas menores? dessa forma não epidemiologia pessoas poderiam ser carrilhão em
Aksakal

Respostas:


3

Anos depois, cheguei a uma resposta satisfatória. Na verdade, acabou por ser o uso de um modelo de contagem proporcional de riscos de Cox , que permite considerar diferentes tempos de truncamento à esquerda (idades em que você começou a seguir os indivíduos), além de diferentes tempos de censura à direita. Conforme observado na pergunta, isso é implementado em R na função de survivalpacote coxph, onde timeé o tempo de truncamento esquerdo, time2é o tempo de censura à direita, eventé o que aconteceu no momento à direita e você usa type='counting'para especificar o modelo de contagem de Cox .

As respostas para perguntas específicas levantadas no meu post são:

1. A sobrevivência pode realmente ser computada com survfit- o modelo explica como o número de indivíduos em risco pode crescer e diminuir ao longo do tempo, à medida que as pessoas entram e saem das faixas etárias em que foram seguidas. Um exemplo para o conjunto de dados de brinquedos publicado acima seriaplot(survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~1, data=data_a))

2. O modelo pode comparar os dados prospectivos truncados à esquerda e os dados retrospectivos não truncados à esquerda, se você simplesmente assumir que os dados retrospectivos são equivalentes a seguir pessoas desde o nascimento. Essa suposição pode não ser perfeita, mas essa é uma limitação inerente ao conjunto de dados que nenhum modelo contornará. O código de exemplo para o conjunto de dados de brinquedos acima seria:

data_c$starting_age = 0
data_c$last_age = data_c$age
data_c$drug = FALSE
nh_compare = rbind(data_a, data_c[,c('indiv_id','starting_age','last_age','event','drug')])
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

3. Parece não haver cálculo de energia em formato fechado; em vez disso, fizemos isso através da inicialização. Nosso código para fazer isso em nosso conjunto de dados específico aparece aqui .

4. coxphpermite covariáveis, por exemplo, em nosso código , usamos coxph(Surv(time=ascertainment_age,time2=surv_age,event=surv_status,type='counting')~asc+family_mutation,data=prore)onde family_mutationé uma covariável.

Publicamos um artigo onde utilizamos essa abordagem para calcular o poder de ensaios clínicos preventivos em doenças genéticas dos príons. Você pode ler os detalhes do bioRxiv e nosso código R é um repositório público do GitHub:

https://github.com/ericminikel/prnp_onset/

Citação:

O objetivo deste estudo foi avaliar a eficácia do uso de antimicrobianos no tratamento de pacientes com câncer de próstata em pacientes com câncer de colo de útero, em pacientes com câncer de colo uterino. , Kitamoto t, Ae R, Hamaguchi t, Sanjo N, Tsukamoto t, Mizusawa H, Collins SJ, Chiesa R, Roiter I, de Pedro-Cuesta J, Calero H, MD Geschwind, Yamada M, Nakamura Y, Mead S. Idade no início da doença genética dos priões e na concepção de ensaios clínicos preventivos . Neurology . 2019 6 de junho. Pii: 10.1212 / WNL.0000000000007745. doi: 10.1212 / WNL.0000000000007745. PubMed PMID: 31171647.


1

Eric, em termos gerais, seu problema parece grave o suficiente para que uma busca por soluções prontas para o mercado pareça equivocada. Em vez disso, você quase certamente precisa recorrer à modelagem sob medida para explorar seu conhecimento especial sobre a fisiopatologia da doença. A menos que você use uma abordagem de modelagem que permita trazer esse conhecimento, você pode não ter uma chance contra o formidável 'oponente' que está enfrentando!

Seu melhor primeiro passo pode ser descobrir exatamente o que 'conhecimento de domínio especial' você realmente possui. Você pode simular o processo que gerou seus dados (ou seja, o processo de geração de dados ou DGP ), incluindo o processo (truncamento à esquerda) que rege a entrada de indivíduos em seu conjunto de dados? Depois que você pode simular o DGP, os métodos bayesianos devem permitir que você desafie seu modelo de simulação com dados - por exemplo, para estimar os parâmetros do seu modelo. Apesar do Odd Aalen fin de siècle ceticismo sobre métodos Bayesiana para análise de sobrevivência [1], constato que há agora pelo menos um texto sobre essas abordagens [2].

Se eu me deparasse com um problema desse tipo, estaria inclinado a explorá-lo primeiro através de simulação e inferência bayesiana. Talvez eu tenha aprendido o suficiente nesse processo para formular modelos de processos mais simples que possam render abordagens de estimativa freqüentista mais tradicionais. A interação entre modelos mais simples e simulações mais ricas pode realmente gerar suas próprias formas valiosas de insight e entendimento.

Espero que você eventualmente atualize todos nós aqui sobre qual abordagem você adotará e como funciona!

  1. Aalen OO. Estatísticas médicas - não há tempo para complacência. Stat Methods Med Res. 2000; 9 (1): 31-40. doi: 10.1177 / 096228020000900105 .

  2. Ibrahim JG, Chen MH, Sinha D. Bayesian Survival Analysis. Nova Iorque: Springer; 2010.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.