Este tutorial tem como objetivo demonstrar, de forma prática e simplificada, a implementação de um modelo de transição de estados (Markov) para a comparação de custo-efetividade entre duas estratégias de saúde utilizando o pacote {heemod} no R.
Nota Importante: Este é um exemplo estritamente ilustrativo. Os parâmetros de eficácia, custos e utilidades utilizados foram criados para fins didáticos e não representam dados reais de uma tecnologia específica ou de uma condição de saúde real.
O foco aqui não está no resultado numérico em si, mas na superioridade do fluxo de trabalho:
Reprodutibilidade: Como o uso de scripts elimina a ambiguidade de planilhas complexas.
Auditabilidade: A facilidade de conferir premissas e fórmulas em um código centralizado.
Agilidade: A rapidez em visualizar a progressão da coorte e a fronteira de eficiência sem a necessidade de macros ou vínculos manuais exaustivos.
Abaixo, seguimos o passo a passo da construção do modelo, desde a definição dos parâmetros até a geração do ICER (Incremental Cost-Effectiveness Ratio).
O heemod (Health Economic Evaluation MODelling)
Filipovic-Pierucci et al. (2016) é um dos
pacotes mais robustos e populares da linguagem R para a área de
Economia da Saúde. Ele foi desenvolvido especificamente
para facilitar a criação, simulação e análise de modelos de
Avaliação de Tecnologias em Saúde (ATS).
Diferente de uma planilha comum, o heemod organiza o
modelo em camadas lógicas, o que o torna o padrão ouro para quem busca
rigor científico Xin et al. (2022).
O que o heemod faz por você?
Modelos de Markov: Ele simplifica a criação de modelos de transição de estados, permitindo que você defina como os pacientes se movem entre diferentes condições de saúde ao longo do tempo.
Análise de Sensibilidade: Possui funções nativas para realizar tanto a Análise de Sensibilidade Determinística (DSA) quanto a Probabilística (PSA), essencial para lidar com incertezas nos dados.
Gestão de Custos e Utilidades: Permite aplicar taxas de desconto financeiro e de saúde de forma automática, garantindo que o cálculo do ICER (Razão de Custo-Efetividade Incremental) seja preciso.
Visualização de Dados: Gera automaticamente gráficos complexos, como o Markov Trace (evolução da coorte) e o Plano de Custo-Efetividade.
O pacote pode ser instalado e utilizado com os códigos a seguir:
# Instale o pacote digitando antes: install.packages("heemod")
# Carregue o pacote para uso dos scripts a seguir
library(heemod)
No heemod, a primeira etapa é isolar todas as variáveis
fundamentais. A função define_parameters() cria um ambiente
dinâmico onde os valores podem ser referenciados por nomes intuitivos,
facilitando a leitura e futuras atualizações.
Para ilustrar a implementação de parâmetros, imagine que queremos comparar o custo e efetividade de um tratamento novo em relação ao que já é utilizado para hipertensão arterial:
# 1. Definir Parâmetros
param <- define_parameters(
rr = 0.927, # Risco Relativo (Eficácia)
dr = 0.00416, # Taxa de decontos
c0 = 148, # Custo unitário do Tratamento padrão
c1 = 1690 # Custo unitário do Tratamento novo
)
Diferente de amarrar valores em fórmulas, aqui estamos criando um
“centro de controle”. Se a taxa de desconto ou os custos mudarem após
uma revisão de literatura, você só precisa alterar este bloco. O
heemod garantirá que essa mudança seja propagada por todo o
modelo de Markov e nas análises de sensibilidade.
Após definir os parâmetros, precisamos descrever como os pacientes se
movem entre os estados de saúde a cada ciclo. No heemod,
utilizamos a função define_transition(). Fazemos isso por
meio de uma matriz com as probabilidades de um paciente sair de um
estado de saúde para o outro. Neste exemplo, vou usar 3 estados:
# Matriz de Transição para o Tratamento Padrão
mat_padrao <- define_transition(
state_names = c("Estavel", "AVC", "Obito"),
C, 0.05, 0.01, # Probabilidades a partir de Estavel
0.03, C, 0.15, # Probabilidades a partir do AVC
0, 0, 1 # Obito é um estado absortivo
)
Um detalhe elegante aqui é o uso da letra C. Ela indica ao R que aquele valor é o complemento da linha, ou seja, o pacote calcula automaticamente a probabilidade de permanecer no mesmo estado para que a soma da linha seja sempre 100%.
Também devemos montar uma matriz de probabilidades para o novo
tratamento. Aqui, em vez de digitar um novo número, aplicamos o
parâmetro rr (Risco Relativo) diretamente na transição. Se
o rr mudar lá no primeiro passo, esta matriz se atualiza
sozinha.
# Matriz de Transição para o Tratamento Novo
mat_novo <- define_transition(
state_names = c("Estavel", "AVC", "Obito"),
C, 0.05 * rr, 0.01, # O Risco Relativo (rr) atua reduzindo a prob. de AVC
0.03, C, 0.15,
0, 0, 1
)
Você pode gerar um diagrama de estados e transições para você validar se a lógica do seu modelo está correta antes mesmo de rodar a simulação. É a transparência que o código oferece de forma instantânea.
# Visualiza os estados e transições do tratamento padrão
plot(mat_padrao)
# Visualiza os estados e transições do tratamento novo
plot(mat_novo)
Agora que temos os caminhos (matriz de transição), precisamos definir
o que acontece com o paciente em cada estado. No heemod,
usamos a função define_state() para atribuir os custos e as
utilidades.
Um dos recursos mais poderosos aqui é o
dispatch_strategy(). Ele permite que o modelo entenda que o
custo no estado “Estável” depende de qual braço da estratégia o paciente
está (Tratamento Padrão ou Novo), mantendo o código limpo e
transparente.
## Define os Estados de Saúde
# Estado Estável: O que acontece quando o paciente está no estado estável
state_A <- define_state(
cost = discount(100 + dispatch_strategy(
trat_padrao = c0, # Custo c0 se for a estratégia padrão
trat_novo = c1 # Custo c1 se for a estratégia nova
), dr),
utility = 0.73
)
# Estado AVC: Custos fixos de hospitalização, sequela e etc.
state_B <- define_state(
cost = discount(2800, dr),
utility = 0.57
)
# Estado Óbito: sem custos ou utilidade
state_C <- define_state(
cost = 0,
utility = 0
)
O que está acontecendo aqui?
discount() aplica a taxa dr que definimos lá
no início. Você não precisa criar colunas estras de cálculo; o R aplica
o desconto financeiro e de saúde ciclo a ciclo.dispatch_strategy() evita que você tenha que criar dois
estados “A” diferentes. O modelo sabe que se ele estiver rodando o
tratamento novo, deve buscar o valor de c1.Agora que temos os caminhos e os valores de cada estado, utilizamos a
função define_strategy() para montar os nossos dois
cenários de comparação.
Esta etapa é puramente organizacional: estamos dizendo ao
heemod qual matriz de transição deve ser usada com quais
estados de saúde para cada braço do estudo.
# Define as Estratégias de Comparação
# Estratégia 0: Tratamento Padrão
strat0 <- define_strategy(
transition = mat_padrao,
Estavel = state_A,
AVC = state_B,
Obito = state_C
)
# Estratégia 1: Novo Tratamento
strat1 <- define_strategy(
transition = mat_novo,
Estavel = state_A,
AVC = state_B,
Obito = state_C
)
Note que usamos os mesmos estados (state_A, state_B e state_C) para
ambas as estratégias. A inteligência do heemod está em:
Usar a matriz específica para cada grupo (aplicando o efeito do tratamento onde ele deve estar).
Usar o dispatch_strategy que configuramos no passo
anterior para aplicar o custo correto (c0 ou c1) automaticamente,
dependendo de qual estratégia está sendo processada.
Isso elimina o risco de você atualizar o custo de uma complicação em uma aba do modelo e esquecer de atualizar na outra. Aqui, o dado é único, a fonte é a mesma, e o erro de digitação torna-se praticamente impossível.
Finalmente, unimos tudo na função run_model(). É neste
comando que o R realiza a simulação dos ciclos (neste caso, 120 meses
para cobrir um horizonte de 10 anos) e calcula os resultados agregados
de custo e efetividade.
# Rodando o Modelo de Custo-Efetividade
res_mod <- run_model(
trat_padrao = strat0,
trat_novo = strat1,
parameters = param,
cycles = 120, # 10 anos
cost = cost,
effect = utility
)
E podemos visualizar os resultados aqui:
# Imprime os resultados da análise
res_mod
## 2 strategies run for 120 cycles.
##
## Initial state counts:
##
## Estavel = 1000L
## AVC = 0L
## Obito = 0L
##
## Counting method: 'life-table'.
##
##
##
## Counting method: 'beginning'.
##
##
##
## Counting method: 'end'.
##
## Values:
##
## cost utility
## trat_padrao 17952279 16784.16
## trat_novo 46394373 17601.90
##
## Efficiency frontier:
##
## trat_padrao -> trat_novo
##
## Differences:
##
## Cost Diff. Effect Diff. ICER Ref.
## trat_novo 28442.09 0.8177429 34781.22 trat_padrao
Na saída, podemos ver que o modelo começou com uma coorte de 1000 pessoas, todas no Estado Estável. Ninguém começou com AVC ou Óbito. Isso é importante para garantir que a comparação entre as duas estratégias seja justa desde o tempo zero.
Esta saída mostra o custo total e a utilidade total para a coorte inteira ao final dos 10 anos (120 ciclos):
O que isso diz? O tratamento novo é claramente mais eficaz (gera mais utilidade), mas também é consideravelmente mais caro.
Diferenças e o ICER é a parte da saída em que a CONITEC ou qualquer gestor olharia primeiro:
Os gráficos são fundamentais para transformar os números da tabela em uma narrativa visual compreensível. O primeiro gráfico é o Diagrama de Transição de Estados. Ele mostra como os 1000 pacientes se espalham pelos estados de saúde ao longo dos ciclos.
plot(res_mod, type = "counts")
O segundo gráfico é o Plano de Custo-Efetividade. Ele visualiza o ICER. A inclinação da linha que liga o tratamento padrão ao novo representa o custo de vida ganho. É a ferramenta definitiva para o tomador de decisão ver se o novo tratamento está dentro da zona de aceitabilidade financeira.
plot(res_mod, type = "ce")
A transição da modelagem de custo-efetividade do Excel para o R,
utilizando pacotes como o heemod, representa um salto
qualitativo na Avaliação de Tecnologias em Saúde (ATS)
Xin et al. (2022). Ao longo deste
tutorial, vimos que a programação não é apenas uma alternativa, mas uma
solução para os gargalos de reprodutibilidade e transparência que as
planilhas muitas vezes apresentam.
Dominar o heemodexige uma curva de aprendizado inicial,
mas esse investimento é exponencial. Enquanto no Excel cada novo modelo
parece um recomeço do zero, no R cada script se torna uma base que pode
ser adaptada, compartilhada e validada por pares com total integridade
científica.