Evitar um valor de referência negativo

No Meridian, o valor de referência representa o resultado esperado no cenário contrafactual em que todas as variáveis de tratamento são definidas como os respectivos valores de referência (zero para mídia paga e orgânica; o valor de referência configurado para tratamentos que não são de mídia). Como o resultado não pode ser negativo, um valor de referência negativo indica um erro estatístico na inferência causal dos efeitos do tratamento. Isso geralmente significa que o modelo está atribuindo crédito demais aos tratamentos. Erros estatísticos são esperados em qualquer modelo, então uma pequena queda ocasional abaixo de zero não é motivo de preocupação. No entanto, um valor de referência extremamente negativo (ou uma alta probabilidade a posteriori de que o valor de referência agregado em toda a janela de tempo seja negativo) é um sinal claro de que o modelo precisa de ajustes.

Definir allows_negative_aggregate_baseline=False em ModelSpec resulta em uma probabilidade de valor de referência negativo de 0.0, conforme avaliado pela verificação de integridade do modelo de valor de referência negativo. Ele restringe o valor de referência do resultado agregado para que não seja negativo em todas as extrações a priori e a posteriori, em que agregado significa a soma de todas as regiões geográficas e períodos (embora os valores de referência para regiões geográficas ou períodos individuais ainda possam ser negativos).

Por padrão, allows_negative_aggregate_baseline=True. Para ativar a restrição, defina allows_negative_aggregate_baseline=False:

from meridian.model import model
from meridian.model import spec

model_spec = spec.ModelSpec(allows_negative_aggregate_baseline=False)
mmm = model.Meridian(input_data=data, model_spec=model_spec)

Como a restrição funciona

O valor de referência esperado é a soma de vários componentes do modelo: efeitos temporais (knot_values; consulte Definir nós), efeitos principais da região geográfica (tau_g_excl_baseline), variáveis de controle e tratamentos não relacionados à mídia avaliados nos valores de referência.

Quando allows_negative_aggregate_baseline=False, o Meridian reparametriza knot_values usando uma mudança ortogonal de base (uma reflexão de Householder) para que o valor de referência agregado em todas as regiões geográficas e períodos seja regido por um único parâmetro, enquanto os componentes \(K - 1\) restantes permanecem sem restrições para capturar efeitos temporais.

Durante a amostragem a priori e a posteriori, o Meridian faz a amostragem dos parâmetros de região geográfica, controle e tratamento não relacionados à mídia primeiro. Depois, ele coloca uma distribuição a priori de TruncatedNormal nesse único parâmetro de nó com um limite inferior dinâmico que depende desses componentes amostrados, garantindo um valor de referência de resultado agregado não negativo em cada extração. Os valores de referência para regiões geográficas ou períodos individuais ainda podem ser negativos quando justificado pelos dados.

Para ver todos os detalhes técnicos, consulte o Apêndice matemático.

Propriedades principais

Ao restringir o valor de referência agregado para que não seja negativo, temos várias propriedades estatísticas e computacionais desejáveis:

  • Probabilidade zero de um valor de referência agregado negativo: cada extração a priori e a posteriori satisfaz a restrição de não negatividade no valor de referência do resultado agregado, garantindo que Analyzer.negative_baseline_probability() seja igual a 0.0 quando avaliado em todas as regiões geográficas e períodos, e que o componente Valor de referência negativo em ModelReviewer retorne PASS (probabilidade de 0.0). Avaliar um subconjunto de regiões geográficas ou períodos (selected_geos, selected_times) ou o valor de referência do KPI (use_kpi=True) quando revenue_per_kpi varia entre regiões ou períodos não é restrito e pode retornar uma probabilidade diferente de zero.
  • Preservação do controle de variáveis de confusão causais: os parâmetros destinados a remover o viés dos efeitos do tratamento, incluindo os efeitos principais geográficos, os coeficientes das variáveis de controle e os componentes \(K - 1\) restantes de knot_values, não são truncados nem restritos.
  • Compatibilidade com todas as estruturas de modelo sem ajuste: ativado com uma única chave booleana (allows_negative_aggregate_baseline=False) sem exigir ajuste de penalidade ou mudanças nas distribuições a priori padrão do Meridian. Funciona perfeitamente em modelos geográficos e nacionais, em qualquer especificação de nó (uma única interceptação constante \(K = 1\), listas de nós manuais, efeitos de tempo integral \(K = T\)ou seleção automática de nós), variáveis de controle, tratamentos não relacionados a mídia, mídia orgânica e canais de alcance e frequência (RF, na sigla em inglês).
  • Sem lentidão na amostragem de MCMC: como a matriz ortogonal de mudança de base é pré-calculada de forma fechada e apenas um parâmetro é truncado, a geometria a posteriori permanece suave para o No-U-Turn Sampler (NUTS) com uma sobrecarga computacional insignificante.
  • Impacto mínimo quando o valor de referência já é positivo: truncar um único parâmetro de nó transformado é um ajuste a priori minimamente suficiente. Quando os dados e as distribuições a priori já favorecem um valor de referência agregado positivo, o limite de truncamento fica bem na cauda esquerda da distribuição. Assim, as estimativas a posteriori mudam muito pouco em comparação com o modelo sem restrições. Como a configuração muda a distribuição a priori, os resultados ainda são diferentes para cada modelo, e a mesma semente aleatória produz extrações diferentes nas duas configurações.

Interação com distribuições a priori e integridade do modelo

Restringir a referência agregada para que não seja negativa interage com as distribuições a priori do modelo e pode revelar conflitos de dados a priori nos diagnósticos de integridade do modelo.

Distribuições a priori de tratamento e diagnósticos de integridade do modelo

Quando a restrição de valor de referência não negativo está ativada, é possível que outros componentes de integridade do modelo sejam afetados se as distribuições a priori de tratamento entrarem em conflito com um valor de referência agregado não negativo.

Um valor de referência negativo em um modelo sem restrições pode surgir de distribuições a priori de tratamento excessivamente otimistas. Quando as distribuições a priori de ROI, mROI ou contribuição implicam uma contribuição total do tratamento que excede o resultado total observado, restringir o valor de referência agregado para que não seja negativo cria um conflito entre as distribuições a priori e os dados. Isso pode fazer com que o resultado total preditivo a posteriori exceda o resultado total observado.

Quando esse conflito ocorre, a restrição impede que o modelo oculte o resultado incremental em excesso dentro de um valor de referência negativo. Em vez disso, o conflito pode aparecer nos diagnósticos de ModelReviewer:

  • Convergência: valores elevados de R-hat (max_r_hat >= 1.2) se as distribuições a priori de tratamento fortes empurrarem o amostrador contra o limite de referência não negativo.
  • Valor p preditivo a posteriori (PPP) bayesiano: um resultado FAIL (valor p < 0.05) quando o resultado total preditivo a posteriori excede o resultado total observado.
  • Qualidade do ajuste: uma redução no R ao quadrado.

Se você observar problemas de convergência, uma falha de PPP bayesiano ou um R ao quadrado menor depois de ativar a restrição, inspecione e recalibre as distribuições a priori de tratamento em vez de permitir um valor de referência negativo. Para orientações detalhadas, consulte Mitigar valores de referência negativos ou baixos.

Efeito na distribuição a priori de knot_values e nos requisitos de a priori personalizada

Com a restrição, a distribuição a priori induzida em knot_values não é mais independente e identicamente distribuída (i.i.d.). Normal. Como a primeira coordenada de nó transformada é truncada em um limite inferior que depende dos parâmetros de região geográfica, controle e tratamento não relacionado à mídia, os knot_values reconstruídos são correlacionados, deslocados para cima no agregado e dependentes desses parâmetros. As distribuições a priori marginais nos parâmetros de tratamento de região geográfica, controle e não relacionados à mídia não são modificadas porque são amostradas antes da coordenada de nó truncada.

As distribuições a priori personalizadas em todos os outros parâmetros do modelo, como mídia roi_m, mroi_m, contribution_m, tau_g_excl_baseline, gamma_c e gamma_n, não têm restrições e são amostradas diretamente das distribuições especificadas.

É possível inspecionar a distribuição a priori resultante com sample_prior. As extrações a priori contêm os knot_values reconstruídos. Os parâmetros internos rotated_knot_0 e rotated_knot_rest não são salvos.

from meridian.analysis import analyzer
from meridian.model import model
from meridian.model import spec

model_spec = spec.ModelSpec(allows_negative_aggregate_baseline=False)
mmm = model.Meridian(input_data=data, model_spec=model_spec)
mmm.sample_prior(500)

# Prior draws of knot_values with dimensions (chain, draw, knots).
knot_values_prior = mmm.inference_data.prior.knot_values

# Prior probability of a negative aggregate baseline; 0.0 under the constraint.
analyzer.Analyzer(mmm).negative_baseline_probability(use_posterior=False)

A comparação dessas extrações com as de um modelo sem restrições (allows_negative_aggregate_baseline=True) mostra como a restrição muda a distribuição a priori de knot_values. Depois de executar sample_posterior, você também pode traçar a distribuição a priori e a posteriori dos knot_values com ModelDiagnostics.plot_prior_and_posterior_distribution(parameter='knot_values').

Apêndice matemático

Nesta seção, descrevemos a fórmula matemática da restrição de valor de referência agregado não negativo. Para mais detalhes sobre a notação matemática usada nesta seção, consulte Notação matemática e Dados de entrada.

1. Condição de referência agregada na escala de KPI transformada

Seja \(y_{g,t} = (\ddot{y}_{g,t}/p_g - m^{[Y]}) / s^{[Y]}\) o KPI centralizado e escalonado pela população. No cenário contrafactual de referência, em que todas as variáveis de mídia paga e orgânica são definidas como zero e os tratamentos não relacionados à mídia são definidos como os respectivos valores de referência \(x^{[N](0)}_{g,t,i}\), o KPI transformado esperado na região geográfica \(g\) e no período \(t\) é:

\[ \hat{y}^{\text{base}}_{g,t} := E\left(Y_{g,t} \;\middle|\; \left\{x^{(0)}_{g,t,i}\right\}, \left\{z_{g,t,i}\right\}\right) = \mu_t + \tau_g + \sum\limits_{i=1}^{N_C} \gamma^{[C]}_{g,i} z_{g,t,i} + \sum\limits_{i=1}^{N_N} \gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i} \]

em que:

  • \(\mu_t = \sum_{k=1}^{K} W_{t,k} b_k\) é a interceptação que varia com o tempo, determinada pela matriz de ponderação de nós \(T \times K\) e pelos parâmetros de nós \(W\) \(b = (b_1, \dots, b_K)^\top\) (consulte Como o argumento knots funciona).
  • \(\tau_g\) é o efeito principal geográfico.
  • \(\gamma^{[C]}_{g,i} z_{g,t,i}\) é a contribuição da variável de controle\(i\).
  • \(\gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i}\) é a contribuição da variável de tratamento não relacionada à mídia \(i\) avaliada no valor de referência contrafactual\(x^{[N](0)}_{g,t,i}\).

Considere que \(u^{[Y]}_{g,t}\) denota revenue_per_kpi (com \(u^{[Y]}_{g,t} = 1\)quando revenue_per_kpi é None) e defina os pesos de resultado normalizados\(w_{g,t}\):

\[ w_{g,t} = \frac{T \cdot p_g u^{[Y]}_{g,t}}{\sum\limits_{g'=1}^{G} \sum\limits_{t'=1}^{T} p_{g'} u^{[Y]}_{g',t'}} \]

para que \(\sum_{g=1}^{G} \sum_{t=1}^{T} w_{g,t} = T\). A inversão da transformação de escalonamento do KPI mostra que o resultado agregado do valor de referência somado em todas as regiões geográficas e períodos não é negativo se, e somente se:

\[ \sum\limits_{k=1}^{K} W^*_k b_k + \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) \ge -\frac{T \cdot m^{[Y]}}{s^{[Y]}} \]

em que \(W^*_k = \sum_{t=1}^{T} W_{t,k} \left(\sum_{g=1}^{G} w_{g,t}\right)\)é a contribuição total ponderada pelo resultado do nó \(k\)e\(\text{offset}(\tau, \gamma^{[C]}, \gamma^{[N]})\) agrega os termos de tratamento não relacionados à mídia de região geográfica, controle e valor de referência ponderados pelo resultado:

\[ \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) = \sum\limits_{g=1}^{G} \sum\limits_{t=1}^{T} w_{g,t} \left( \tau_g + \sum\limits_{i=1}^{N_C} \gamma^{[C]}_{g,i} z_{g,t,i} + \sum\limits_{i=1}^{N_N} \gamma^{[N]}_{g,i} x^{[N](0)}_{g,t,i} \right) \]

2. Mudança ortogonal de base para knot_values

Para isolar a combinação linear \((W^*)^\top b = \sum_{k=1}^{K} W^*_k b_k\)em uma única coordenada sem alterar a geometria anterior, o Meridian constrói uma matriz ortogonal simétrica \(K \times K\) \(Q\)(\(Q Q^\top = I_K\)) como uma reflexão de Householder de forma fechada, em que a primeira linha é o vetor unitário \(u = W^* / \|W^*\|_2\).

Definição dos parâmetros de nós transformados\(\tilde{b} = (\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K)^\top = Q b\)(para que \(b = Q^\top \tilde{b}\); no gráfico de computação do modelo,\(\tilde{b}_1\) seja chamado de rotated_knot_0 e\((\tilde{b}_2, \dots, \tilde{b}_K)\) seja chamado de rotated_knot_rest):

  • A contribuição agregada do nó depende exclusivamente da primeira coordenada transformada \(\tilde{b}_1\):

    \[ (W^*)^\top b = (W^*)^\top Q^\top \tilde{b} = \|W^*\|_2 \, \tilde{b}_1 \]

  • Como \(Q\) é ortogonal, a distribuição a priori normal isotrópica de média zero\(b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) é invariável sob transformações ortogonais e induz distribuições a priori\(\text{Normal}(0, \sigma_b)\) mutuamente independentes nas coordenadas transformadas\(\tilde{b}_1, \tilde{b}_2, \dots, \tilde{b}_K\):

    \[ b_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b) \quad \text{for } k = 1, \dots, K \quad \Longleftrightarrow \quad \tilde{b}_k \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b) \quad \text{for } k = 1, \dots, K \]

3. Truncamento dinâmico em \(\tilde{b}_1\)

Durante a amostragem a priori e a posteriori, o Meridian faz a amostragem de \(\tau_g\),\(\gamma^{[C]}_{g,i}\)e \(\gamma^{[N]}_{g,i}\) primeiro, avalia o limite inferior dinâmico:

\[ \tilde{b}_{1,\text{low}}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right) = \frac{-\frac{T \cdot m^{[Y]}}{s^{[Y]}} - \text{offset}\left(\tau, \gamma^{[C]}, \gamma^{[N]}\right)}{\|W^*\|_2} \]

e coloca uma distribuição a priori TruncatedNormal no parâmetro único \(\tilde{b}_1\):

\[ \tilde{b}_1 \sim \text{TruncatedNormal}\left(\text{loc}=0, \text{scale}=\sigma_b, \text{low}=\tilde{b}_{1,\text{low}}, \text{high}=\tilde{b}_{1,\text{high}}\right) \]

em que o limite superior de truncamento é definido como:

\[ \tilde{b}_{1,\text{high}} = \max\left(\tilde{b}_{1,\text{low}} + 50\sigma_b, \; 50\sigma_b\right) \]

O limite superior é um requisito numérico, não uma restrição de modelagem. O NUTS faz amostras \(\tilde{b}_1\) em uma escala sem restrições pela transformação sigmoide que o TruncatedNormal do TensorFlow Probability usa, o que requer limites finitos. Definir o limite superior pelo menos \(50\sigma_b\) maior que zero e\(\tilde{b}_{1,\text{low}}\) deixa uma probabilidade a priori insignificante na cauda superior, então ele se comporta como \(+\infty\) na prática.

Os demais \(K - 1\) parâmetros de nós transformados \(\tilde{b}_2, \dots, \tilde{b}_K \stackrel{\text{i.i.d.}}{\sim} \text{Normal}(0, \sigma_b)\) permanecem como variáveis normais sem restrições, e o Meridian reconstrói os parâmetros de nós originais como \(b = Q^\top \tilde{b}\).