O código abaixo gera um conjunto de dados de teste que consiste em uma série de probabilidades de "sinal" com ruído binomial ao seu redor. O código então usa 5000 conjuntos de números aleatórios como séries "explicativas" e calcula o valor p da regressão logística para cada um.
Acho que as séries explicativas aleatórias são estatisticamente significativas no nível de 5% em 57% dos casos. Se você ler a parte mais longa do post abaixo, atribuo isso à presença do sinal forte nos dados.
Então, aqui está a pergunta principal: qual teste devo usar ao avaliar a significância estatística de uma variável explicativa quando os dados contiverem um sinal forte? O simples valor p parece ser bastante enganador.
Aqui está uma explicação mais detalhada do problema.
Estou intrigado com os resultados que recebo para os valores de p de regressão logística quando o preditor é realmente apenas um conjunto de números aleatórios. Meu pensamento inicial era que a distribuição dos valores-p deveria ser plana neste caso; o código R abaixo mostra, na verdade, um enorme aumento nos baixos valores de p. Aqui está o código:
set.seed(541713)
lseries <- 50
nbinom <- 100
ntrial <- 5000
pavg <- .1 # median probability
sd <- 0 # data is pure noise
sd <- 1 # data has a strong signal
orthogonalPredictor <- TRUE # random predictor that is orthogonal to the true signal
orthogonalPredictor <- FALSE # completely random predictor
qprobs <- c(.05,.01) # find the true quantiles for these p-values
yactual <- sd * rnorm(lseries) # random signal
pactual <- 1 / (1 + exp(-(yactual + log(pavg / (1-pavg)))))
heads <- rbinom(lseries, nbinom, pactual)
## test data, binomial noise around pactual, the probability "signal"
flips <- cbind(heads, nbinom - heads)
# summary(glm(flips ~ yactual, family = "binomial"))
pval <- numeric(ntrial)
for (i in 1:ntrial){
yrandom <- rnorm(lseries)
if (orthogonalPredictor){ yrandom <- residuals(lm(yrandom ~ yactual)) }
s <- summary(glm(flips ~ yrandom, family="binomial"))
pval[i] <- s$coefficients[2,4]
}
hist(pval, breaks=100)
print(quantile(pval, probs=c(.01,.05)))
actualCL <- sapply(qprobs, function(c){ sum(pval <= c) / length(pval) })
print(data.frame(nominalCL=qprobs, actualCL))
O código gera dados de teste consistindo em ruído binomial em torno de um sinal forte e, em um loop, ajusta uma regressão logística dos dados contra um conjunto de números aleatórios e acumula os valores p dos preditores aleatórios; os resultados são exibidos como um histograma de valores p, os quantis reais do valor p para níveis de confiança de 1% e 5% e a taxa real de falso positivo correspondente a esses níveis de confiança.
Eu acho que uma razão para os resultados inesperados é que um preditor aleatório geralmente terá alguma correlação com o sinal verdadeiro e isso explica principalmente os resultados. No entanto, se você definir orthogonalPredictor
para TRUE
, haverá zero correlação entre os preditores aleatórios e o sinal real, mas o problema ainda estará lá em um nível reduzido. Minha melhor explicação para isso é que, como o sinal verdadeiro não está em nenhum lugar do modelo sendo ajustado, o modelo é especificado incorretamente e os valores de p são suspeitos de qualquer maneira. Mas esse é um problema - quem já tem um conjunto de preditores disponíveis que se encaixa exatamente nos dados? Então, aqui estão algumas perguntas adicionais:
Qual é a hipótese nula precisa para regressão logística? Os dados são um ruído puramente binomial em torno de um nível constante (ou seja, não há um sinal verdadeiro)? Se você definir sd como 0 no código, não haverá sinal e o histograma parecerá plano.
A hipótese nula implícita no código é que o preditor não tem mais poder explicativo do que um conjunto de números aleatórios; é testado usando, digamos, o quantil empírico de 5% para o valor-p, conforme exibido pelo código. Existe uma maneira melhor de testar essa hipótese, ou pelo menos uma que não seja tão numericamente intensa?
------ Informação adicional
Esse código imita o seguinte problema: Taxas de inadimplência históricas mostram variação significativa ao longo do tempo (sinal) impulsionada por ciclos econômicos; as contagens padrão reais em um determinado momento são binomiais em torno dessas probabilidades padrão. Eu estava tentando encontrar variáveis explicativas para o sinal quando suspeitei dos valores de p. Neste teste, o sinal é ordenado aleatoriamente ao longo do tempo, em vez de mostrar os ciclos econômicos, mas isso não deve importar para a regressão logística. Portanto, não há sobredispersão, o sinal realmente deve ser um sinal.