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.
fonte
Respostas:
Existem várias questões aqui. Em particular, parece haver algumas confusões sobre como simular uma regressão logística padrão. Resumidamente, você não adiciona
noise around... the probability "signal"
. Como resultado da maneira como você fez isso, há uma enorme quantidade de variabilidade nos dados 'binomiais' (esque) resultantes, muito mais do que deveria. Aqui estão as probabilidades no seu conjunto de dados:Se essas observações .4+ terminarem de um lado ou de outro, elas agirão como 'outliers' (na verdade não são) e gerarão um erro do tipo 1 em um modelo que não leva em consideração o fato de que esses dados não são realmente binomiais. Aqui está uma versão que usa um hack simples para permitir que o modelo detecte e leve em conta a sobredispersão:
Este é o resumo do modelo da última iteração. Note-se que a dispersão é estimada em≈ 12 × o que deveria ser para um binômio verdadeiro:
Aqui está outra versão, onde eu me encaixo no mesmo modelo que você, mas apenas gere os dados sem o ruído adicional ao redor do sinal. (Observe que o código que é o mesmo é omitido por questões de brevidade.)
fonte
yrandom
), é por isso que esses são erros do tipo 1, com os quais você está preocupado. Há consideravelmente mais variabilidade nas distribuições de resposta condicional do que em um binômio. Essa é a definição de superdispersão. Para ser mais específico, suas distribuições condicionais são binomiais beta , não binomiais.family=quasibinomial
. Provavelmente, você não só tem super-dispersão, mas provavelmente erros que estão correlacionados ao longo do tempo.A relação do código com o objetivo experimental é confusa. Você espera um preditor significativo para qualquer seleção de ortogonalPredictor ou sd? Eu não.
Com base na minha interpretação, parece que o experimento não está alinhado com o que estamos tentando testar. Onde o ruído é gerado, está implicitamente sendo repetidamente (ou seja, não aleatoriamente) anexado a observações individuais, o que fornece um sinal para a regressão.
Aqui está o que eu acho que foi planejado:
As mudanças críticas são:
Para nenhuma correlação entre y_actual e nosso preditor y:
E criando uma correlação bastante forte:
fonte
sd =1
&orthogonalPredictor = FALSE
, (ingenuamente) não deve funcionar porque a variável x (yrandom
) é gerada aleatoriamente e não está relacionada à variável y.