Isso é semelhante ao Bootstrap: a estimativa está fora do intervalo de confiança
Eu tenho alguns dados que representam contagens de genótipos em uma população. Quero estimar a diversidade genética usando o índice de Shannon e também gerar um intervalo de confiança usando o bootstrapping. Notei, no entanto, que a estimativa via bootstrapping tende a ser extremamente tendenciosa e resulta em um intervalo de confiança que fica fora da minha estatística observada.
Abaixo está um exemplo.
# Shannon's index
H <- function(x){
x <- x/sum(x)
x <- -x * log(x, exp(1))
return(sum(x, na.rm = TRUE))
}
# The version for bootstrapping
H.boot <- function(x, i){
H(tabulate(x[i]))
}
Geração de dados
set.seed(5000)
X <- rmultinom(1, 100, prob = rep(1, 50))[, 1]
Cálculo
H(X)
## [1] 3.67948
xi <- rep(1:length(X), X)
H.boot(xi)
## [1] 3.67948
library("boot")
types <- c("norm", "perc", "basic")
(boot.out <- boot::boot(xi, statistic = H.boot, R = 1000L))
##
## CASE RESAMPLING BOOTSTRAP FOR CENSORED DATA
##
##
## Call:
## boot::boot(data = xi, statistic = H.boot, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 3.67948 -0.2456241 0.06363903
Gerando os ICs com correção de viés
boot.ci(boot.out, type = types)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = boot.out, type = types)
##
## Intervals :
## Level Normal Basic Percentile
## 95% ( 3.800, 4.050 ) ( 3.810, 4.051 ) ( 3.308, 3.549 )
## Calculations and Intervals on Original Scale
Supondo que a variação de t possa ser usada para a variação de t0 .
norm.ci(t0 = boot.out$t0, var.t0 = var(boot.out$t[, 1]))[-1]
## [1] 3.55475 3.80421
Seria correto relatar o IC centrado em torno de t0 ? Existe uma maneira melhor de gerar o bootstrap?
Como aponta a resposta de @NRH, o problema não é que o bootstrapping deu um resultado tendencioso. É que a estimativa "plug-in" simples da entropia de Shannon, com base nos dados de uma amostra, é enviesada para baixo em relação ao verdadeiro valor da população.
Esse problema foi reconhecido na década de 1950, poucos anos após a definição desse índice. Este artigo discute as questões subjacentes, com referências à literatura associada.
a relação não linear significa que o valor resultante é uma subestimação parcial da verdadeira diversidade genética.
Existem pacotes no R que lidam com esse problema. O
simboot
pacote, em particular, possui uma funçãoestShannonf
que faz essas correções de polarização e uma funçãosbdiv
para calcular os intervalos de confiança. Será melhor usar essas ferramentas de código aberto estabelecidas para sua análise, em vez de tentar começar do zero.fonte
simboot
pacote parece promissor, mas não parece adequado para meus propósitos, pois precisa de uma amostra de controle para estimar os intervalos de confiança.simboot
não atender às suas necessidades, o Google "Shannon entropia viés r" para links para outros pacotes R, comoentropy
,entropart
, eEntropyEstimation
.