Como calculo intervalos de confiança para uma distribuição não normal?

21

Eu tenho 383 amostras que têm um viés pesado para alguns valores comuns, como eu calcularia o IC95% para a média? O IC que calculei parece muito distante, o que suponho é que meus dados não parecem uma curva quando eu faço um histograma. Então, acho que preciso usar algo como bootstrapping, que não entendo muito bem.

IhaveCandy
fonte
2
Uma solução seria usar o IC assintótico que utiliza o fato de que o RV tem uma distribuição normal padrão limitante. Sua amostra é razoavelmente grande, portanto pode ser uma boa aproximação. X¯-μS/n
precisa saber é
1
Não, você encontrará uma cobertura de cauda muito ruim nas duas caudas do intervalo de confiança usando essa abordagem. A cobertura média pode, por sorte, ser boa, mas ambas as taxas de erro de cauda estarão erradas.
Frank Harrell
2
O que significa "viés pesado para alguns valores comuns"? Observe que o viés tem um significado particular nas estatísticas; você deve tentar evitá-lo se não estiver falando sério. Você quer dizer simplesmente "alguns valores específicos ocorrem com muita frequência"? Você pode mostrar seus cálculos e alguma exibição ou tabela de seus dados?
Glen_b -Reinstate Monica

Respostas:

21

Sim, o bootstrap é uma alternativa para obter intervalos de confiança para a média (e você deve fazer um pouco de esforço se quiser entender o método).

A ideia é a seguinte:

  1. Reamostrar com tempos B de reposição.
  2. Para cada uma dessas amostras, calcule a média da amostra.
  3. Calcule um intervalo de confiança de autoinicialização apropriado .

Em relação à última etapa, existem vários tipos de intervalo de confiança de autoinicialização (BCI). As referências a seguir apresentam uma discussão sobre as propriedades de diferentes tipos de BCI:

http://staff.ustc.edu.cn/~zwp/teach/Stat-Comp/Efron_Bootstrap_CIs.pdf

http://www.tau.ac.il/~saharon/Boot/10.1.1.133.8405.pdf

É uma boa prática calcular vários BCI e tentar entender possíveis discrepâncias entre eles.

No R, você pode implementar facilmente essa ideia usando o pacote R 'boot' da seguinte maneira:

rm(list=ls())
# Simulated data
set.seed(123)
data0 = rgamma(383,5,3)
mean(data0) # Sample mean

hist(data0) # Histogram of the data

library(boot) 

# function to obtain the mean
Bmean <- function(data, indices) {
  d <- data[indices] # allows boot to select sample 
    return(mean(d))
} 

# bootstrapping with 1000 replications 
results <- boot(data=data0, statistic=Bmean, R=1000)

# view results
results 
plot(results)

# get 95% confidence interval 
boot.ci(results, type=c("norm", "basic", "perc", "bca"))
Munchausen
fonte
3
A última etapa, calcular várias, implica a pesca de um IC que você gosta no resultado. Você deve decidir o tipo de IC que deseja com base no que eles são antes.
John John
@ John CI diferente tem propriedades diferentes. É uma boa prática verificar possíveis discrepâncias (e tentar investigar a fonte disso). Não se trata de pescar por um resultado conveniente.
Munchausen
Absolutamente, mas sem essa descrição do motivo em sua resposta, "implica" pesca. E você ainda não está afirmando que é essencial escolher o IC que você deseja primeiro. Estou sugerindo uma atualização da resposta com algumas informações críticas para um questionador ingênuo. Seria ainda melhor se você declarar qual IC geralmente prefere e por que, ou qual prefere em casos como esse e por quê.
John John
2
@IhaveCandy: Não. Ele demonstra o Teorema do Limite Central, ou seja, como a distribuição amostral da média tende ao normal, mesmo para valores após uma distribuição muito "anormal". É por isso que o simples intervalo de confiança z não será muito diferente de qualquer outra solução sofisticada, por exemplo, autoinicialização.
Michael M
1
@IhaveCandy Por favor, veja o meu comentário acima, Michael Mayer está fazendo o mesmo ponto.
JohnK
8

Outra alternativa padrão é calcular o IC com o teste de Wilcoxon. Em R

wilcox.test(your-data, conf.int = TRUE, conf.level = 0.95)

Infelizmente, ele fornece o IC em torno da (pseudo) mediana, não a média, mas se os dados estiverem muito fora do normal, talvez a mediana seja uma medida mais informativa.

Jacques Wainer
fonte
2

Para dados log-normais, Olsson (2005) sugere um 'método de Cox modificado'

XE(X)=θregistro(θ)

Y¯=S22±tdfS2n+S42(n-1)

Y=registro(X)YY¯YS2

Uma função R está abaixo:

ModifiedCox <- function(x){
  n <- length(x)
  y <- log(x)
  y.m <- mean(y)
  y.var <- var(y)

  my.t <- qt(0.975, df = n-1)

  my.mean <- mean(x)
  upper <- y.m + y.var/2 + my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))
  lower <- y.m + y.var/2 - my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))

 return(list(upper = exp(upper), mean = my.mean, lower = exp(lower)))

}

Repetindo o exemplo do artigo de Olsson

CO.level <- c(12.5, 20, 4, 20, 25, 170, 15, 20, 15)

ModifiedCox(CO.level)
$upper
[1] 78.72254

$mean
[1] 33.5

$lower
[1] 12.30929
Tony Ladson
fonte
1

n=383

Restabelecer Monica
fonte