Área sob o “pdf” na estimativa da densidade do kernel em R


15

Estou tentando usar a função ' densidade ' em R para fazer estimativas de densidade do kernel. Estou tendo alguma dificuldade em interpretar os resultados e comparar vários conjuntos de dados, pois parece que a área sob a curva não é necessariamente 1. Para qualquer função de densidade de probabilidade (pdf) ϕ(x) , precisamos ter a área ϕ(x)dx=1 . Estou assumindo que a estimativa da densidade do kernel reporta o pdf. Estou usando o integrar.xy do sfsmisc para estimar a área sob a curva.

> # generate some data
> xx<-rnorm(10000)
> # get density
> xy <- density(xx)
> # plot it
> plot(xy)

gráfico da densidade

> # load the library
> library(sfsmisc)
> integrate.xy(xy$x,xy$y)
[1] 1.000978
> # fair enough, area close to 1
> # use another bw
> xy <- density(xx,bw=.001)
> plot(xy)

densidade com pc = 0,001

> integrate.xy(xy$x,xy$y)
[1] 6.518703
> xy <- density(xx,bw=1)
> integrate.xy(xy$x,xy$y)
[1] 1.000977
> plot(xy)

densidade com pc = 1

> xy <- density(xx,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 6507.451
> plot(xy)

densidade com pc = 1e-6

A área sob a curva não deve ser sempre 1? Parece que as pequenas larguras de banda são um problema, mas às vezes você deseja mostrar os detalhes etc. nas caudas e pequenas larguras de banda são necessárias.

Atualização / resposta:

220

> xy <- density(xx,n=2^15,bw=.001)
> plot(xy)

densidade com maior número de pontos a serem amostrados

> integrate.xy(xy$x,xy$y)
[1] 1.000015
> xy <- density(xx,n=2^20,bw=1e-6)
> integrate.xy(xy$x,xy$y)
[1] 2.812398


3
Parece uma limitação de ponto flutuante na densidade (): ao usar uma largura de banda de 1e-6, você está criando (em teoria) uma coleção de 10.000 picos, cada um com massa total 1/10000. Esses picos acabam sendo representados principalmente por seus picos, sem que as lacunas sejam adequadamente caracterizadas. Você está apenas empurrando a densidade () além dos limites.
whuber

@whuber, por limitação de ponto flutuante, você quer dizer limites de precisão, pois o uso de flutuadores levaria a uma superestimação maior do erro em comparação ao uso de dobras. Acho que não vejo como isso aconteceria, mas gostaria de ver algumas evidências.
highBandWidth

n

1

@ Anony-Mousse, sim, é isso que esta pergunta está perguntando. Por que não está avaliando para 1?
HighBandWidth

Respostas:


9

Pense nos integrate.xy()usos da regra trapezoidal . Para a distribuição normal, subestimará a área sob a curva no intervalo (-1,1) em que a densidade é côncava (e, portanto, a interpolação linear está abaixo da densidade real) e a superestimará em outros lugares (conforme a interpolação linear) em cima da densidade real). Como a última região é maior (na medida de Lesbegue, se você preferir), a regra do trapézio tende a superestimar a integral. Agora, à medida que você passa para larguras de banda menores, praticamente toda a sua estimativa é convexa, com muitos picos estreitos correspondentes aos pontos de dados e vales entre eles. É aí que a regra do trapézio se rompe especialmente.


isso significa que estamos "superamostrando" os picos e "subamostrando" os vales, em algum sentido ondulado à mão. Como a visualização também segue a regra trapezoidal (interpolação linear entre as amostras), parece que uma largura de banda do kernel muito pequena também é ruim para a visualização. Além disso, se pudéssemos obter um número maior de pontos nos quais calculamos a densidade, haveria menos problemas.
highBandWidth 10/08

1
Esta explicação não retém água. O problema é que a densidade é inadequadamente discretizada, não que a regra do trapézio se quebre muito. integrar () é impotente para obter uma resposta correta, porque densidade () não produz uma representação correta. Para ver isso, basta inspecionar xy $ x: ele possui apenas 512 valores destinados a representar 10.000 picos estreitos!
whuber

@ Whuber, foi o que a resposta disse. O ponto é que você precisa usar a regra trapezoidal para número finito de amostras e superestima a área em comparação com a densidade real em um eixo contínuo de acordo com os núcleos. Minha atualização no final da pergunta se expande.
highBandWidth 10/08

1
@high Não; a regra trapezoidal está funcionando bem. O problema é que ele está trabalhando com uma discretização incorreta do integrando. Você não pode ter "muitos picos estreitos correspondentes aos pontos de dados" quando existem 10.000 pontos de dados e apenas 512 valores na matriz de densidade!
whuber

1
Olhando para esses gráficos, agora estou pensando que o problema é com densitye não com integrate.xy. Com N = 10000 e bw = 1e-6, você teria que ver um pente com uma altura de cada dente de cerca de 1e6, e os dentes ficarem mais densos em torno de 0. Em vez disso, você ainda verá uma curva em forma de sino reconhecível. O mesmo densityestá traindo você, ou pelo menos deve ser usado de maneira diferente com pequenas larguras de banda: ndeve ser sobre (intervalo de dados) / (bw) e não o padrão n=512. O intergrator deve estar captando um desses valores enormes que densityretorna por uma infeliz coincidência.
StasK

-1

Tudo bem, você pode consertar as mudanças e redimensionamentos; adicione o menor número para que a densidade não seja negativa e multiplique a coisa toda por uma constante, de modo que a área seja unificada. Este é o caminho mais fácil.

L2c[ϕ(x)c]+


2
Observe que a pergunta é mais sobre por que a densityfunção não produz a densidade "adequada" que se integra a 1 - e não sobre como corrigi-la.
Tim
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.