Conforme observado por Henry , você está assumindo a distribuição normal e não há problema se seus dados seguirem a distribuição normal, mas estarão incorretos se você não puder assumir a distribuição normal para eles. Abaixo, descrevo duas abordagens diferentes que você pode usar para distribuição desconhecida, considerando apenas pontos de dados x
e estimativas de densidade correspondentes px
.
A primeira coisa a considerar é o que exatamente você deseja resumir usando seus intervalos. Por exemplo, você pode estar interessado nos intervalos obtidos usando quantis, mas também na região de maior densidade (veja aqui ou aqui ) da sua distribuição. Embora isso não deva fazer muita diferença (se houver) em casos simples, como distribuições simétricas e unimodais, isso fará diferença para distribuições mais "complicadas". Geralmente, os quantis fornecem um intervalo contendo massa de probabilidade concentrada em torno da mediana (os médios da sua distribuição), enquanto a região de maior densidade é uma região em torno dos modos100 α%da distribuição. Isso ficará mais claro se você comparar as duas parcelas da figura abaixo - os quantis "cortam" a distribuição verticalmente, enquanto a região de maior densidade "corta" horizontalmente.
A próxima coisa a considerar é como lidar com o fato de você ter informações incompletas sobre a distribuição (assumindo que estamos falando de distribuição contínua, você tem apenas alguns pontos e não uma função). O que você pode fazer é pegar os valores "como estão" ou usar algum tipo de interpolação ou suavização para obter os valores "entre".
Uma abordagem seria usar a interpolação linear (veja ?approxfun
em R) ou, alternativamente, algo mais suave como splines (veja ?splinefun
em R). Se você escolher essa abordagem, lembre-se de que os algoritmos de interpolação não têm conhecimento de domínio sobre seus dados e podem retornar resultados inválidos, como valores abaixo de zero, etc.
# grid of points
xx <- seq(min(x), max(x), by = 0.001)
# interpolate function from the sample
fx <- splinefun(x, px) # interpolating function
pxx <- pmax(0, fx(xx)) # normalize so prob >0
A segunda abordagem que você pode considerar é usar a distribuição de densidade / mistura do kernel para aproximar sua distribuição usando os dados que você possui. A parte complicada aqui é decidir sobre a largura de banda ideal.
# density of kernel density/mixture distribution
dmix <- function(x, m, s, w) {
k <- length(m)
rowSums(vapply(1:k, function(j) w[j]*dnorm(x, m[j], s[j]), numeric(length(x))))
}
# approximate function using kernel density/mixture distribution
pxx <- dmix(xx, x, rep(0.4, length.out = length(x)), px) # bandwidth 0.4 chosen arbitrary
Em seguida, você encontrará os intervalos de interesse. Você pode prosseguir numericamente ou por simulação.
1a) Amostragem para obter intervalos quantílicos
# sample from the "empirical" distribution
samp <- sample(xx, 1e5, replace = TRUE, prob = pxx)
# or sample from kernel density
idx <- sample.int(length(x), 1e5, replace = TRUE, prob = px)
samp <- rnorm(1e5, x[idx], 0.4) # this is arbitrary sd
# and take sample quantiles
quantile(samp, c(0.05, 0.975))
1b) Amostragem para obter a região de maior densidade
samp <- sample(pxx, 1e5, replace = TRUE, prob = pxx) # sample probabilities
crit <- quantile(samp, 0.05) # boundary for the lower 5% of probability mass
# values from the 95% highest density region
xx[pxx >= crit]
2a) Encontre quantis numericamente
cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]] # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary
2b) Encontre a região de maior densidade numericamente
const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const
Como você pode ver nas plotagens abaixo, no caso de distribuição simétrica unimodal, ambos os métodos retornam o mesmo intervalo.
100 α %Pr ( X∈ u ± Ç) ≥ αζ