Como posso estimar a densidade de um parâmetro inflado com zero em R?

10

Eu tenho um conjunto de dados com muitos zeros que se parece com isso:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

Gostaria de desenhar uma linha para sua densidade, mas a density()função usa uma janela em movimento que calcula valores negativos de x.

lines(density(x), col = 'grey')

density(... from, to)argumentos, mas eles parecem apenas truncar o cálculo, não alterar a janela, para que a densidade em 0 seja consistente com os dados, como pode ser visto no seguinte gráfico:

lines(density(x, from = 0), col = 'black')

(se a interpolação fosse alterada, eu esperaria que a linha preta tivesse maior densidade em 0 do que a linha cinza)

Existem alternativas para essa função que proporcionariam um melhor cálculo da densidade em zero?

insira a descrição da imagem aqui

Abe
fonte

Respostas:

14

A densidade é infinita em zero porque inclui um pico discreto. Você precisa estimar o pico usando a proporção de zeros e depois estimar a parte positiva da densidade, assumindo que seja suave. O KDE causará problemas no lado esquerdo, porque dará peso a valores negativos. Uma abordagem útil é transformar em logs, estimar a densidade usando o KDE e depois transformar novamente. Veja Wand, Marron & Ruppert (JASA 1991) para uma referência.

A seguinte função R fará a densidade transformada:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

A seguir, será apresentado o gráfico que você deseja:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

insira a descrição da imagem aqui

Rob Hyndman
fonte
Obrigado pela sua resposta, mas estou confuso - você diz 'estimar o pico usando a proporção de zeros', mas o traça sem limites. o espigão tem uma altura discreta ou é infinito, se discreto, é ? P(X=0)
Abe
Esta é uma mistura de uma distribuição discreta e uma distribuição contínua. Quando plotado como uma densidade, o pico é infinito (na verdade, uma função delta do Dirac). Às vezes, as pessoas plotam a parte discreta como uma função de massa de probabilidade (então o pico tem altura ) e a parte contínua como uma função de densidade. Isso provavelmente cria um visual melhor, mas envolve duas escalas diferentes. P(X=0)
Rob Hyndman
isso está sendo útil. fyi: parece que, embora bw = "SJ" afete a densidade no espaço não transformado, a densidade do log é a mesma usando "SJ" e o padrão "nrd0" ... Estou prestes a ler a referência do SJ: "Sheather and Jones (1991) Um método confiável de seleção de largura de banda baseada em dados para estimativa de densidade de kernel ". jstor.org/stable/2345597
Abe
4

Concordo com Rob Hyndman que você precisa lidar com os zeros separadamente. Existem alguns métodos para lidar com uma estimativa de densidade de kernel de uma variável com suporte limitado, incluindo 'reflexão', 'rernormalização' e 'combinação linear'. Eles não parecem ter sido implementados na densityfunção de R , mas estão disponíveis no pacote de Stenn de Benn Jannkdens .

uma parada
fonte
1

Outra opção quando você tem dados com um limite inferior lógico (como 0, mas pode haver outros valores) que você sabe que os dados não ficarão abaixo e a estimativa da densidade do kernel regular colocará valores abaixo desse limite (ou se você tiver um limite superior , ou ambos) é usar estimativas de linha de logs. O pacote de logspline para R implementa isso e as funções têm argumentos para especificar os limites, para que a estimativa vá para o limite, mas não além e ainda seja dimensionada para 1.

Também existem métodos (a oldlogsplinefunção) que levarão em consideração a censura por intervalo; portanto, se esses 0 não forem z exatos, mas arredondados para que você saiba que eles representam valores entre 0 e algum outro número (um limite de detecção, por exemplo), então você pode fornecer essas informações à função de ajuste.

Se os 0 extra são verdadeiros 0 (não arredondados), a estimativa da massa do pico ou do ponto é a melhor abordagem, mas também pode ser combinada com a estimativa da linha de logs.

Greg Snow
fonte
0

Você pode tentar diminuir a largura de banda (a linha azul é para adjust=0.5), insira a descrição da imagem aqui

mas provavelmente o KDE não é o melhor método para lidar com esses dados.


fonte
existe outro método que você recomendaria?
Abe
@Abe Bem, isso depende do que você quer fazer ...