Planejamento de cenários e otimização de orçamento futuro

Esta seção explica como usar o Meridian para o planejamento de cenários, incluindo como incorporar dados e suposições sobre o futuro em cenários de otimização do orçamento.

Como parte da otimização de orçamento futura, o Meridian prevê o resultado incremental com base em um conjunto de suposições sobre o futuro. O Meridian não prevê o valor do resultado futuro, apenas a parte incremental. Veja mais detalhes em Por que o Meridian não prevê resultados.

O que é o planejamento de cenários?

O planejamento de cenários é uma análise de modelagem do mix de marketing (MMM) que pode incorporar suposições sobre o futuro. Para análises após a modelagem, como retorno do investimento (ROI, na sigla em inglês), curvas de resposta e otimização de orçamento, o Meridian usa dados históricos para fazer suposições padrão. Em alguns casos, essas suposições são pertinentes para o planejamento futuro, mas nem sempre. Novos dados podem ser incorporados à análise para modificar as suposições conforme necessário.

Confira abaixo como as estratégias futuras podem ser diferentes das históricas.

  • Custo por unidade de mídia: o custo por unidade de mídia em um canal pode ter mudado ou pode vir a mudar. Consulte o Exemplo 1 e o Exemplo 2 de código.
  • Receita por unidade de indicador principal de desempenho (KPI, na sigla em inglês): a receita por KPI (por exemplo, preço unitário ou valor da vida útil) pode ter mudado ou pode vir a mudar. Consulte o Exemplo 3 de código.
  • Padrão do período de veiculação: seus padrões de período de veiculação históricos e futuros podem não corresponder. Por exemplo, você pode ter apresentado um novo canal de mídia durante a janela de treinamento do modelo. O padrão histórico do período de veiculação do novo canal pode conter zeros ou mostrar uma tendência de aumento que pode não continuar. Consulte o Exemplo 4 de código.

Métricas de análise pós-modelagem

O planejamento de cenários afeta as definições de métricas, mas não a estimativa de parâmetros. Para ilustrar esses conceitos, considere um caso hipotético no qual mínimos quadrados comuns são usados para estimar o efeito do tratamento de um medicamento com a hipótese de que a dosagem em mg (X) afeta linearmente o resultado (Y), como no modelo:

\[ Y = \alpha + X \beta + \epsilon \ . \]

O efeito do tratamento depende do coeficiente de dosagem $\beta$, que é um parâmetro estimado com base em um conjunto de dados observado. O efeito do tratamento pode ter várias definições de métricas possíveis. Por exemplo, é possível definir o efeito de um medicamento como a mudança esperada no resultado causada por uma dose de 10 mg ($10 \beta$) ou uma dose de 15 mg ($15 \beta$). As duas definições de efeito do tratamento podem ser extraídas do mesmo modelo e da mesma estimativa de coeficiente $\hat{\beta}$.

No Meridian, a definição das métricas de análise após a modelagem depende de certas características dos dados. Por exemplo, o ROI depende de um período especificado, um conjunto de regiões geográficas, um padrão de período de veiculação (distribuição relativa de unidades de mídia em regiões geográficas e períodos), o total de unidades de mídia por canal, o custo por unidade de mídia e a receita por KPI. Outras métricas de análise após a modelagem incluem resultado esperado, resultado incremental, ROI marginal, custo por KPI incremental (CPIK, na sigla em inglês), curvas de resposta e alocação de orçamento ideal. Por padrão, essas métricas são definidas usando input_data transmitidos para o Meridian. No entanto, é possível fornecer new_data para especificar definições de métricas alternativas. A Tabela 1 mostra quais propriedades de dados afetam a definição de cada métrica.

Tabela 1: lista de propriedades de dados que afetam a definição de métrica de cada método.

Período Conjunto de regiões geográficas Padrão de período de veiculação Total de unidades de mídia por canal Custo por unidade de mídia Receita por KPI (se aplicável) Valores de controle
expected_outcome X X X X X X
incremental_outcome X X X X X
roi, marginal_roi, cpik X X X X X X
response_curves X X X X X
BudgetOptimizer.optimize X X X X X

‡ A otimização de orçamento usa o total de unidades de mídia por canal (em combinação com o padrão fixo do período de veiculação e as suposições de custo por unidade de mídia) para atribuir um orçamento total padrão (somente otimização de orçamento fixo) e restrições de orçamento no canal. Se essas configurações forem substituídas usando os argumentos budget e pct_of_spend de BudgetOptimizer.optimize, o total de unidades de mídia por canal não afeta a otimização.

A estimativa de cada métrica de análise após a modelagem depende da distribuição a posteriori dos parâmetros do modelo. A distribuição a posteriori é condicional em input_data transmitidos ao construtor do objeto do Meridian (excluindo o KPI para regiões geográficas e períodos especificados em ModelSpec.holdout_id). A distribuição a posteriori é estimada quando sample_posterior é chamado, e essa estimativa é usada para todas as análises após a modelagem.

O argumento new_data

O valor padrão de cada propriedade de dados na Tabela 1 é derivado de input_data transmitidos para o Meridian. Na análise pós-modelagem, o usuário pode substituir os dados de entrada usando o argumento new_data disponível na maioria dos métodos. Cada método usa apenas um subconjunto dos atributos new_data. A Tabela 2 indica quais atributos new_data são usados por cada método.

Tabela 2: lista de atributos new_data usados por cada método.

media, reach, frequency revenue_per_kpi media_spend, rf_spend organic_media, organic_reach, organic_frequency, non_media_treatments controls time A dimensão de tempo precisa corresponder a input_data
expected_outcome X X X X sim
incremental_outcome X X X não
roi, cpik, marginal_roi X X X não
response_curves X X X X não
BudgetOptimizer.optimize X X X X não

As propriedades de dados são derivadas de new_data da mesma forma que dos dados de entrada. Por exemplo, o custo por unidade de mídia é calculado para cada região e período dividindo-se o gasto pelas unidades de mídia.

Se o período de new_data corresponder ao período dos dados de entrada, não será necessário especificar todos os atributos new_data usados pelo método que você está utilizando. Você pode fornecer qualquer subconjunto de atributos, e os atributos restantes serão extraídos dos dados de entrada.

No entanto, se o período de new_data for diferente dos dados de entrada, você precisará transmitir todos os atributos new_data usados pelo método que está utilizando. Todos os atributos de new_data precisam ter a mesma dimensão de tempo. Apenas o método expected_outcome exige que a dimensão de tempo corresponda aos dados de entrada.

Os métodos response_curves e optimize também exigem que os rótulos de data sejam fornecidos para new_data.time se a dimensão de tempo não corresponder aos dados de entrada. Os rótulos de dados não afetam os cálculos, mas são usados para rótulos de eixos em algumas visualizações.

Método auxiliar para criar new_data para otimização do orçamento

Pode parecer contraditório que o gasto no canal seja uma saída e uma entrada new_data de BudgetOptimizer.optimize. A saída é a alocação de gastos ideal, enquanto o gasto de entrada é usado com as unidades de mídia para definir um custo presumido por unidade de mídia em cada região e período. O gasto de entrada também é usado para definir o orçamento total de um cenário de otimização de orçamento fixo e as restrições de orçamento do canal, mas isso pode ser substituído usando os argumentos budget e pct_of_spend.

O método optimizer.create_optimization_tensors está disponível para usuários que preferem inserir os dados de custo por unidade de mídia diretamente. Esse método cria um objeto new_data especificamente para ser transmitido ao método BudgetOptimizer.optimize usando as seguintes opções de dados de entrada.

Canais que não são de alcance e frequência:

  1. unidades de mídia e custo por unidade de mídia
  2. gasto e custo por unidade de mídia

Canais de alcance e frequência quando use_optimal_frequency=True:

  1. impressões e custo por impressão
  2. gasto e custo por impressão

Canais de alcance e frequência quando use_optimal_frequency=False:

  1. impressões, frequência e custo por impressão
  2. gasto, frequência e custo por impressão

Exemplos ilustrativos

O objetivo desta seção é explicar como os cálculos são feitos para as funções de análise após a modelagem mais importantes: Analyzer.incremental_outcome, Analyzer.roi, Analyzer.response_curves e BudgetOptimizer.optimize.

Em particular, esses exemplos mostram como o cálculo de cada método é feito usando input_data e new_data. Nesses exemplos, input_data inclui uma "janela de pré-modelagem" para os dados das unidades de mídia, enquanto new_data não inclui. A "janela de pré-modelagem" contém dados de unidades de mídia anteriores ao primeiro período da "janela de modelagem", o que permite que o modelo considere adequadamente o efeito defasado dessas unidades. Quando new_data abrange um período diferente do coberto por input_data (como nesses exemplos), os dados das unidades de mídia precisam ter o mesmo número de períodos que todos os outros dados novos.

Além de new_data, cada um desses métodos tem um argumento selected_times. Esses argumentos personalizam a definição da métrica de saída, não a estimativa de parâmetros. Consulte O que é o planejamento de cenários? para mais informações.

O método Analyzer.incremental_outcome também tem um argumento media_selected_times que permite personalizar ainda mais a definição de resultado incremental. Esse argumento oferece mais flexibilidade ao Analyzer.incremental_outcome do que os outros métodos. Os outros métodos não têm esse argumento porque os cálculos envolvem a correspondência do resultado incremental a algum custo associado, o que pode ser ambíguo quando selected_times e media_selected_times são personalizáveis. No entanto, é possível parear manualmente a saída incremental_outcome com dados de custo para criar definições de ROI personalizadas, por exemplo.

Em um modelo geográfico, cada região tem um resultado incremental, um ROI e uma curva de resposta próprios. Pense em cada exemplo como representando uma única região geográfica. Os resultados nacionais são conseguidos agregando todas as regiões. Cada um desses métodos tem um argumento selected_geos, que permite ao usuário especificar um subconjunto de regiões geográficas para incluir na definição da métrica.

Resultado incremental

Para cada canal de mídia, o método incremental_outcome compara o resultado esperado em dois cenários hipotéticos. Em um cenário, as unidades de mídia são definidas como os valores históricos. No outro cenário, as unidades de mídia são definidas como zero para alguns ou todos os períodos.

O argumento media_selected_times determina os períodos em que as unidades de mídia são definidas como zero.

O argumento selected_times determina o período em que o resultado incremental é medido.

Usar input_data

A definição padrão de resultado incremental define media_selected_times como todos os períodos, incluindo a "janela de modelagem" e a "janela pré-modelagem". As unidades de mídia input_data podem incluir, de forma opcional, uma "janela de pré-modelagem", que permite ao modelo considerar adequadamente o efeito de defasagem dessas unidades.

selected_times padrão são todos os períodos na "janela de modelagem", o que significa que o resultado incremental é agregado em todos esses períodos.

input_data pode conter unidades de mídia durante uma "janela de pré-modelagem" para considerar os efeitos atrasados. A "janela de pré-modelagem" não contém dados além das unidades de mídia. Por isso, as células estão em branco na ilustração.

scenario-planning1

Usar input_data com selected_times e media_selected_times modificados

Para entender o uso de new_data em incremental_outcome e outros métodos, é importante entender os argumentos selected_times e media_selected_times.

Neste exemplo, media_selected_times está definido como um único período (semana 0). Enquanto isso, selected_times está definido para as semanas de 0 a 3. Este exemplo ilustra um cenário em que max_lag é definido como 3 no ModelSpec. Portanto, o resultado incremental precisa ser zero a partir da semana 4 em diante. Como resultado, essa combinação de media_selected_times e selected_times captura o impacto total de longo prazo das unidades de mídia da semana 0.

scenario-planning2

Usar new_data com um novo período

Quando new_data é transmitido com um número de períodos diferente de input_data, não há uma "janela de pré-modelagem". Considera-se que as unidades de mídia sejam zero para todos os períodos anteriores à janela de tempo new_data.

A definição padrão de resultado incremental estabelece media_selected_times e selected_times como todos os períodos na janela de tempo new_data.

scenario-planning3

ROI

Para cada canal de mídia, o método roi divide o resultado incremental gerado em selected_times pelo gasto durante selected_times. O método roi não tem um argumento media_selected_times. O resultado incremental compara o contrafactual em que as unidades de mídia são definidas como valores históricos com o contrafactual em que essas unidades são definidas como zero para todos os períodos.

Usar input_data

Por padrão, selected_times é definido como toda a "janela de modelagem". O contrafactual define as unidades de mídia como zero para todos os períodos nas janelas de modelagem e pré-modelagem.

scenario-planning4

Usar new_data com um novo período

Quando new_data é transmitido com um número de períodos diferente de input_data, não há uma "janela de pré-modelagem". Considera-se que as unidades de mídia sejam zero para todos os períodos anteriores à janela de tempo new_data.

scenario-planning5

Curvas de resposta e otimização de orçamento

O método response_curves é semelhante a roi porque o resultado incremental e o gasto são agregados em selected_times, que é definido como toda a "janela de modelagem" por padrão. Cada ponto no eixo x da curva de resposta é uma porcentagem do gasto histórico no intervalo selected_times. Esse método calcula o resultado incremental correspondente (eixo y) ajustando as unidades de mídia históricas pelo mesmo fator. O fator de escalonamento é aplicado às unidades de mídia das janelas de modelagem e pré-modelagem.

A otimização do orçamento se baseia em curvas de resposta. Portanto, a mesma ilustração se aplica as duas. Observe que BudgetOptimizer.optimize descontinuou o argumento selected_times e agora usa os argumentos start_date e end_date.

Usar input_data

Por padrão, selected_times é definido como toda a "janela de modelagem". As unidades de mídia de conjuntos contrafactuais são ajustadas para todos os períodos na "janela de modelagem" e na "janela pré-modelagem".

Nesta ilustração, a curva de resposta é calculada com 50% do orçamento de orçamento input_data.

scenario-planning6

Usar new_data com um novo período

Quando new_data é transmitido com um número de períodos diferente de input_data, não há uma "janela de pré-modelagem". Considera-se que as unidades de mídia sejam zero para todos os períodos anteriores à janela de tempo new_data.

Nesta ilustração, a curva de resposta é calculada com 50% do orçamento de new_data.

scenario-planning7

Exemplos de código para otimização de orçamento

Os exemplos a seguir mostram o poder de new_data para otimização de orçamento e planejamento de cenários futuros. Para fins ilustrativos, cada exemplo se concentra em um atributo principal dos dados de entrada que pode ser modificado usando new_data. No entanto, todas essas suposições (e outras) podem ser combinadas em um cenário de otimização.

Imagine que você quer otimizar seu orçamento para um trimestre futuro que deve ter um padrão de período de veiculação, custo por unidade de mídia e receita por KPI semelhantes ao último trimestre de dados de entrada. Use o último trimestre de dados de entrada para representar o cenário futuro e ajuste os aspectos que devem mudar. Veja isso em cada um dos exemplos.

Em cenários futuros mais complicados, talvez seja melhor substituir completamente os dados de entrada por novos dados. Isso pode ser feito construindo as matrizes em Python ou carregando os dados de um arquivo CSV.

Nestes exemplos, há três canais de mídia. O KPI é a unidade de vendas, e revenue_per_kpi é fornecido. Para ilustração, cada exemplo executa um cenário de otimização com base no quarto trimestre de 2024. Um elemento principal do cenário é modificado em cada exemplo, e o argumento new_data é usado para incorporar a mudança.

O código em cada exemplo pressupõe que um modelo Meridian foi inicializado como mmm, que o método sample_posterior foi chamado e que um BudgetOptimizer foi inicializado como opt.

mmm = model.Meridian(...)
mmm.sample_posterior(...)
opt = optimizer.BudgetOptimizer(mmm)

Exemplo 1: novo custo por unidade de mídia para um único canal

Imagine que o custo por unidade de mídia no primeiro canal esteja para dobrar em breve. Portanto, dobre o custo por unidade de mídia presumido desse canal na otimização. Para isso, crie uma matriz de gasto que corresponda aos dados de entrada, exceto se o gasto for o dobro para o primeiro canal. A matriz é transmitida ao construtor DataTensors, que, por sua vez, é transmitido ao argumento new_data da otimização.

A modificação de media_spend também afeta o orçamento total padrão para otimização de orçamento fixo, bem como as restrições de gasto padrão. Esses padrões podem ser substituídos usando os argumentos de otimização budget e pct_of_spend. É importante conhecer esses argumentos e personalizá-los conforme necessário.

# Create `new_data` from `input_data`, but double the spend for channel 0.
new_spend = mmm.input_data.media_spend
new_spend[:, :, 0] *= 2
new_data = analyzer.DataTensors(media_spend=new_spend)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
    new_data=new_data,
    budget=100,
    pct_of_spend=[0.3, 0.3, 0.4],
    start_date="2024-10-07",
    end_date="2024-12-30",
)

Exemplo 2: novo custo por mídia para todos os canais

Suponha que o custo por unidade de mídia mude em breve para todos os canais. Assim, você deve alterar o custo por unidade de mídia presumido de todos os canais na otimização. Para cada canal, o custo previsto é uma constante conhecida em todos os períodos e regiões. O método auxiliar create_optimization_tensors, que cria um objeto DataTensors, é conveniente para essa tarefa porque o custo por unidade de mídia (cpmu) é uma entrada direta.

O método create_optimization_tensors exige que todos os argumentos de otimização sejam transmitidos. É possível transmitir media ou media_spend (com dimensão geográfica e de tempo) para especificar o padrão do período de veiculação. A dimensão de tempo de todos os argumentos de create_optimization_tensors deve coincidir (media não pode incluir outros períodos para efeitos defasados).

# Create `new_data` using the helper method. The cost per media unit (cpmu) is
# set to a constant value for each channel.
new_cpmu = np.array([0.1, 0.2, 0.5])
media_excl_lag = mmm.input_data.media[:, -mmm.n_times:, :]
new_data = opt.create_optimization_tensors(
    time=mmm.input_data.time,
    cpmu=new_cpmu,
    media=media_excl_lag,
    revenue_per_kpi=mmm.input_data.revenue_per_kpi,
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
    new_data=new_data,
    budget=100,
    pct_of_spend=[0.3, 0.3, 0.4],
    start_date="2024-10-07",
    end_date="2024-12-30",
)

A mesma tarefa pode ser realizada criando diretamente o objeto DataTensors. Para isso, o gasto é calculado dimensionando-se as unidades de mídia de cada canal pelo custo por unidade de mídia desse canal.

# Create `new_data` without the helper method.
# In this example, `mmm.n_media_times > mmm.n_times` because the `media` data
# contains additional lag history. These time periods are discarded to create
# the new spend data.
media_excl_lag = mmm.input_data.media[:, -mmm.n_times:, :]
new_spend = media_excl_lag * np.array([0.1, 0.2, 0.5])
new_data = analyzer.DataTensors(media_spend=new_spend)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
    new_data=new_data,
    budget=100,
    pct_of_spend=[0.3, 0.3, 0.4],
    start_date="2024-10-07",
    end_date="2024-12-30",
)

Exemplo 3: nova receita por KPI

Imagine que a receita por KPI (por exemplo, preço unitário ou valor da vida útil) possa mudar em breve. A nova suposição de receita por KPI pode ser incorporada à otimização. Vale destacar que essa mudança influencia a receita presumida gerada por unidade de KPI incremental, mas não muda o ajuste do modelo no próprio KPI.

# Create `new_data` from `input_data`, but double the revenue per kpi.
new_data = analyzer.DataTensors(
    revenue_per_kpi=mmm.input_data.revenue_per_kpi * 2
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
    new_data=new_data,
    budget=100,
    pct_of_spend=[0.3, 0.3, 0.4],
    start_date="2024-10-07",
    end_date="2024-12-30",
)

Exemplo 4: novo padrão de período de veiculação

Talvez você esteja considerando um padrão de período de veiculação futuro diferente (alocação relativa de unidades de mídia em regiões geográficas ou períodos). Um motivo comum é quando você planeja transferir o orçamento de uma região geográfica para outra. Outro motivo comum é considerar um novo canal de mídia inserido durante a janela de dados de entrada. Ao introduzir um novo canal, o padrão histórico do período de veiculação registra zero unidades de mídia antes do período em que o canal foi implementado. Se você planeja executar o novo canal de forma contínua, os zeros no padrão de veiculação devem ser substituídos por outros valores para refletir melhor o padrão de veiculação planejado para o futuro.

Neste exemplo, imagine que o primeiro canal de mídia foi inserido durante o quarto trimestre de 2024. Talvez ele tenha tido um gasto zero inicial e aumentado ao longo do trimestre. No entanto, no futuro, você espera definir uma constante de unidades de mídia per capita em todas as regiões e períodos. O argumento media de DataTensors é usado para especificar o padrão do período de veiculação. Ao especificar esse argumento para um modelo geográfico, é recomendável considerar o padrão do período de veiculação pretendido em termos de unidades de mídia per capita.

O número exato de unidades de mídia per capita (100 neste exemplo) não afeta o padrão do período de veiculação. Esse padrão é a alocação relativa de unidades de mídia em regiões geográficas e períodos. Portanto, o mesmo padrão pode ser alcançado atribuindo-se 10 unidades per capita, por exemplo. No entanto, as unidades de mídia também afetam a suposição de custo por unidade de mídia, que é derivada da proporção de gasto por unidade de mídia em cada região e período. Neste exemplo, os novos dados de gasto são transmitidos para alcançar um custo por unidade de mídia de 0,1 em todos os períodos e regiões geográficas.

A modificação de media_spend também afeta o orçamento total padrão para otimização de orçamento fixo, bem como as restrições de gasto padrão. Esses padrões podem ser substituídos usando os argumentos de otimização budget e pct_of_spend. É importante conhecer esses argumentos e personalizá-los conforme necessário.

# Create new media units data from the input data, but set the media units per
# capita to 100 for channel 0 for all geos and time periods.
new_media = mmm.input_data.media.values
new_media[:, :, 0] = 100 * mmm.input_data.population.values[:, None]
# Set a cost per media unit of 0.1 for channel 0 for all geos and time periods.
new_media_spend = mmm.input_data.media_spend.values
new_media_spend[:, :, 0] = 0.1 * new_media[:, -mmm.n_times:, 0]
new_data = analyzer.DataTensors(
    media=new_media,
    media_spend=new_spend,
)
# Run fixed budget optimization on the last quarter of 2024, using customized
# total budget and constraints.
opt_results = opt.optimize(
    new_data=new_data,
    budget=100,
    pct_of_spend=[0.3, 0.3, 0.4],
    start_date="2024-10-07",
    end_date="2024-12-30",
)

Por que o Meridian não prevê resultados

O Meridian não precisa prever o resultado esperado no futuro para que a inferência causal seja útil no planejamento futuro. Na verdade, o Meridian tem métodos para ajudar no planejamento futuro, incluindo a classe Optimizer e muitos outros, como roi, marginal_roi e incremental_outcome. Nesses métodos, o argumento new_data permite usar a inferência causal do Meridian para estimar quantidades de qualquer execução de mídia ou padrão de período de veiculação hipotético, incluindo a execução futura.

O objetivo do Meridian é a inferência causal. Basicamente, a meta é inferir o resultado incremental que as variáveis de tratamento têm no resultado. Usando termos do glossário, simplificamos a definição de resultado incremental como

\[ \text{Incremental Outcome} = \text{Expected Outcome} - \text{Counterfactual} \]

em que o significado de contrafactual depende do tipo de tratamento. Consulte o glossário para mais informações e a definição de resultado incremental para uma definição mais precisa.

As variáveis de controle influenciam o resultado esperado, mas não o resultado incremental, exceto pelo efeito que elas têm na redução do viés dos efeitos de mídia. Isso acontece porque o modelo do Meridian especifica que as variáveis de controle têm um efeito aditivo no "Resultado esperado" e no "Contrafactual", que é cancelado na diferença. Para prever o resultado esperado, precisamos estimar os dados de controle. Essa tarefa pode ser bastante complexa, já que muitos controles são muito ruidosos, imprevisíveis e completamente fora da alçada de um anunciante. A previsão dos dados de controle seria ortogonal aos objetivos de inferência causal do Meridian, porque podemos inferir o resultado incremental e até mesmo otimizá-lo sem necessariamente prever o resultado esperado.

Da mesma forma, os efeitos temporais, parametrizados pelos nós, são aditivos. Como resultado, "Resultado esperado" e "Contrafactual" dependem dos valores do nó, mas o "Resultado incremental" não. A abordagem do Meridian baseada em nós para modelagem de padrões temporais não foi projetada para previsão. Em vez disso, ela foi projetada para oferecer um modelo muito mais flexível para padrões temporais, o que se torna adequado para o problema de inferência causal.