A estatística t pode ter quase nada a dizer sobre a capacidade preditiva de um recurso, e não deve ser usada para filtrar preditores ou permitir que preditores entrem em um modelo preditivo.
Valores P dizem que características espúrias são importantes
Considere a seguinte configuração de cenário em R. Vamos criar dois vetores, o primeiro é simplesmente lançamentos aleatórios de moedas:5000
set.seed(154)
N <- 5000
y <- rnorm(N)
O segundo vetor é de observações, cada uma atribuída aleatoriamente a uma das 500 classes aleatórias de tamanho igual:5000500
N.classes <- 500
rand.class <- factor(cut(1:N, N.classes))
Agora, ajustamos um modelo linear para prever o que é y
dado rand.classes
.
M <- lm(y ~ rand.class - 1) #(*)
O correto valor para todos os coeficientes é zero, nenhum deles tem qualquer poder de previsão. No entanto, muitos deles são significativos no nível de 5%
ps <- coef(summary(M))[, "Pr(>|t|)"]
hist(ps, breaks=30)
De fato, devemos esperar que cerca de 5% deles sejam significativos, mesmo que não tenham poder preditivo!
Os valores P falham ao detectar recursos importantes
Aqui está um exemplo na outra direção.
set.seed(154)
N <- 100
x1 <- runif(N)
x2 <- x1 + rnorm(N, sd = 0.05)
y <- x1 + x2 + rnorm(N)
M <- lm(y ~ x1 + x2)
summary(M)
Eu criei dois preditores correlacionados , cada um com poder preditivo.
M <- lm(y ~ x1 + x2)
summary(M)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.1271 0.2092 0.608 0.545
x1 0.8369 2.0954 0.399 0.690
x2 0.9216 2.0097 0.459 0.648
Os valores p falham em detectar o poder preditivo de ambas as variáveis porque a correlação afeta a precisão com que o modelo pode estimar os dois coeficientes individuais a partir dos dados.
As estatísticas inferenciais não existem para dizer sobre o poder preditivo ou a importância de uma variável. É um abuso dessas medidas usá-las dessa maneira. Existem opções muito melhores disponíveis para seleção de variáveis em modelos lineares preditivos, considere usar glmnet
.
(*) Observe que estou deixando uma interceptação aqui, portanto, todas as comparações são com a linha de base de zero, não com a média do grupo da primeira classe. Essa foi a sugestão do @ whuber.
Como levou a uma discussão muito interessante nos comentários, o código original foi
rand.class <- factor(sample(1:N.classes, N, replace=TRUE))
e
M <- lm(y ~ rand.class)
o que levou ao seguinte histograma