A co-variação de preditores pode ser um negócio complicado. Eles tornam as estimativas instáveis, reduzindo nosso poder estatístico e dificultando a interpretação. Neste artigo, demonstrarei como ignorar a presença de covariação entre preditores ao explorar nossos modelos pode levar a resultados estranhos e como podemos lidar com esse problema.
Contents
Nosso Modelo
Para o nosso exemplo, usaremos alguns dados (falsos) de crescimento do desenvolvimento – temos a altura e o peso de 500 indivíduos com idades entre 5 e 24 anos. Podemos representar graficamente nossos dados trivariados como:
Isso geralmente parece o que se poderia esperar – pessoas mais altas pesam mais, pessoas mais velhas são mais altas e pesam mais também.
Previsão do peso da altura
Vamos ajustar um modelo linear OLS para prever o peso de altura e idade:
fit
#>
#> Call:
#> lm(formula = weight ~ height + age, data = data)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -23.8960 -3.9637 -0.0438 4.3013 25.8607
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -51.97123 5.27409 -9.854 height 0.53458 0.05741 9.312 age 2.47319 0.25311 9.771 ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 7.009 on 497 degrees of freedom
#> Multiple R-squared: 0.7856, Adjusted R-squared: 0.7847
#> F-statistic: 910.4 on 2 and 497 DF, p-value:
Sem surpresa, ambos age
e height
estão positivamente relacionados com weight
.
Vamos explorar nosso modelo – especificamente, queremos ver que peso podemos esperar para 3 indivíduos das seguintes alturas: 120, 145 e 170cm. Podemos fazer isso com emmeans
:
library(emmeans)
em_by_height
#> height emmean SE df lower.CL upper.CL
#> 120 49.0 1.536 497 46.0 52.0
#> 145 62.4 0.321 497 61.7 63.0
#> 170 75.7 1.402 497 73.0 78.5
#>
#> Confidence level used: 0.95
Também podemos adicionar esses valores esperados ao gráfico acima:
Algo parece errado – o valor esperado para uma pessoa de 120 cm de altura parece muito alto, enquanto o valor esperado para uma pessoa de 170 cm de altura parece muito baixo. Por que é que? O que está acontecendo?
Primeiro, vamos falar sobre o elefante na sala – há uma multicolinearidade óbvia entre nossos preditores! Se não tivermos certeza, podemos usar performance::check_collinearity()
para validar isso:
performance::check_collinearity(fit)
#> # Check for Multicollinearity
#>
#> Moderate Correlation
#>
#> Parameter VIF Increased SE
#> height 5.26 2.29
#> age 5.26 2.29
Mas como isso está relacionado às estimativas ruins que obtivemos?
Bem, isso tem a ver com o que fazemos com o de outros preditores ao explorar um único preditor. No nosso caso, o que acontece com age
quando estamos explorando o papel de height
em nosso modelo?
A abordagem comum e quase padrão é consertar age
a uma constante. Isso é realmente o que nosso modelo faz em primeiro lugar: o coeficiente de height
representa a mudança esperada em weight
enquanto age
é fixo e não pode variar. Qual constante? Um candidato natural (e de fato emmeans
‘padrão) é a média. Em nosso caso, a média de idade é de 14,9 anos. Portanto, os valores esperados produzidos acima são para três crianças de 14,9 anos com alturas diferentes. Mas esses dados são plausíveis? Se eu dissesse que vi uma pessoa com 120 cm de altura, você também assumiria que ela tinha 14,9 anos?
Não, você não faria. E é exatamente isso que a covariância e a multicolinearidade significam – que algumas combinações de preditores são mais prováveis do que outras.
Previsão de peso a partir da altura (considerando a covariância entre os preditores)
Então, como podemos obter pesos esperados mais razoáveis?
Bem, podemos permitir age
para variar em nossa previsão. Variar como? Bem, variam com a altura! Então, ao invés de perguntar “Quais são as alturas esperadas de 3 indivíduos com 120, 145 e 170 cm de altura, todos da mesma idade”, Nós podemos pergutar “Quais são as alturas esperadas de 3 indivíduos com 120, 145 e 170 cm de altura, com idades adequadas à altura”.
No emmeans
isso pode ser feito especificando uma fórmula preditiva em cov.reduce
. Por exemplo:
(rg_multicov
#> 'emmGrid' object with variables:
#> height = 120, 145, 170
#> age = (predicted by other variables)
[email protected]
#> height age .wgt.
#> 1 120 9.537649 1
#> 2 145 14.640867 1
#> 3 170 19.744085 1
emmeans(rg_multicov, ~ height)
#> height emmean SE df lower.CL upper.CL
#> 120 35.8 0.727 497 34.3 37.2
#> 145 61.8 0.315 497 61.1 62.4
#> 170 87.7 0.673 497 86.4 89.1
#>
#> Confidence level used: 0.95
Podemos ver na grade de referência ([email protected]
) aquele age
não é fixo, mas varia com height
.
Também podemos conseguir o mesmo em uma única chamada para emmeans()
:
em_by_height2
#> height emmean SE df lower.CL upper.CL
#> 120 35.8 0.727 497 34.3 37.2
#> 145 61.8 0.315 497 61.1 62.4
#> 170 87.7 0.673 497 86.4 89.1
#>
#> Confidence level used: 0.95
O que fizemos foi essencialmente reintroduzir a multicolinearidade em nossas estimativas, permitindo age
para co-variar com height
: cada valor esperado não é mais apenas uma função de height
, mas também é uma função do esperado age
por isso height
.
Se tramarmos estes estimativas, obtemos …
… O que parece mais razoável.
Resumo
Você deve fazer isso sempre que houver multicolinearidade em seus dados?
Não – nem sempre e não só!
Você pode querer fazer isso sempre que explorar um preditor enquanto fixa outro em uma constante produz e improvável combinações de preditores. Na verdade, tal situação pode surgir mesmo quando as medidas de multicolinearidade (como o VIF) não são “muito” altas, já que geralmente medem apenas co-linearidade, mas outros padrões de co-variação podem estar presentes em seus dados. Na verdade, isso pode ser útil em qualquer instância de co-variação entre preditores, como supressão / confusão / mediação (faça sua escolha).
Observe também que produzir previsões desta maneira não “resolve” nenhuma das dificuldades de interpretação ou qualquer uma das estranhezas que surgem na supressão / confusão / mediação estatística. (Extra) cuidado deve ser tomado ao interpretar os parâmetros e as predições de modelos com preditores co-variáveis. Neste nosso caso, a questão de “o peso varia mais com a idade ou com a altura”Não pode ser respondido claramente – qual é o significado de olhar para o coeficiente (ou coeficiente padronizado) de um preditor enquanto mantém o outro constante quando sabemos que eles co-variam fortemente?
Apenas o código, por favor:
knitr::opts_chunk$set(echo = FALSE,
message = FALSE,
comment = "#>")
library(emmeans)
library(ggplot2)
source('../msbblog_theme_pallets.R')
theme_set(theme_msbblog())
library(dplyr)
library(effectsize)
S %
data.frame() %>%
rename(height = X1,
age = X2,
e = X3) %>%
mutate(age = change_scale(age, to = c(5, 24)),
height = change_scale(height, to = c(108, 189)),
weight = 7 * (scale(height) + scale(age) + scale(age ^ 2 * e)) + 63)
base_plot [email protected][,"age"]
base_plot +
geom_point(data = p_dat,
aes(y = emmean, color = age),
shape = 24, size = 2, stroke = 2, fill = "black")
performance::check_collinearity(fit)
(rg_multicov [email protected]
emmeans(rg_multicov, ~ height)
em_by_height2 [email protected][,"age"]
base_plot +
geom_point(data = p_dat,
aes(y = emmean, color = age),
shape = 24, size = 2, stroke = 2, fill = "black")
Relacionados