Площадь под «pdf» в оценке плотности ядра в R


15

Я пытаюсь использовать функцию плотности в R для оценки плотности ядра. У меня возникли некоторые трудности при интерпретации результатов и сравнении различных наборов данных, так как кажется, что площадь под кривой не обязательно равна 1. Для любой функции плотности вероятности (pdf) нам нужно иметь площадь . Я предполагаю, что оценка плотности ядра сообщает PDF. Я использую integrate.xy из sfsmisc, чтобы оценить площадь под кривой.- ϕ ( x ) d x = 1φ(Икс)-φ(Икс)dИксзнак равно1

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

график плотности

> # 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)

плотность с bw = .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)

плотность с bw = 1

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

плотность с bw = 1e-6

Разве площадь под кривой не должна всегда быть 1? Кажется, небольшая пропускная способность является проблемой, но иногда вы хотите показать детали и т. Д. В хвостах, и требуются небольшие пропускные способности.

Обновление / ответ:

Кажется, что ответ ниже о переоценке в выпуклых областях является правильным, так как увеличение количества точек интегрирования, кажется, уменьшает проблему (я не пытался использовать более точек.)220

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

плотность с большим количеством точек для выборки в

> 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
Это похоже на ограничение с плавающей запятой в плотности (): при использовании полосы пропускания 1e-6 вы создаете (теоретически) коллекцию из 10 000 шипов, каждая из которых имеет общую массу 1/10000. Эти шипы в конечном итоге представляются в основном их пиками, при этом промежутки не характеризуются адекватно. Вы просто толкаете плотность () за ее пределы.
whuber

@whuber, под ограничением с плавающей запятой вы подразумеваете пределы точности, так как при использовании чисел с плавающей запятой это приведет к большей переоценке ошибки по сравнению с использованием двойных чисел. Я не думаю, что вижу, как это произойдет, но хотел бы увидеть некоторые доказательства.
highBandWidth

N

1

@ Anony-Mousse, да, это то, что этот вопрос задает. Почему это не оценка 1?
highBandWidth

Ответы:


9

Подумайте об использовании правила трапеции integrate.xy(). Для нормального распределения он будет недооценивать площадь под кривой в интервале (-1,1), где плотность является вогнутой (и, следовательно, линейная интерполяция ниже истинной плотности), и переоценивать ее в другом месте (поскольку линейная интерполяция идет на вершине истинной плотности). Поскольку последняя область больше (в мерке Лесбега, если хотите), правило трапеции имеет тенденцию переоценивать интеграл. Теперь, когда вы переходите на меньшую полосу пропускания, почти все ваши оценки являются кусочно выпуклыми, с множеством узких пиков, соответствующих точкам данных и промежутками между ними. Вот где правило трапеции особенно сильно нарушается.


это означает, что мы «передискретизируем» пики и «недосэмплируем» долины, в некотором смысле волнистой стороны. Поскольку визуализация также следует трапециевидному правилу (линейная интерполяция между выборками), она кажется слишком маленькой, а пропускная способность ядра также плоха для визуализации. Кроме того, если бы мы могли получить большее количество точек, в которых мы рассчитываем плотность, проблем было бы меньше.
highBandWidth

1
Это объяснение не выдерживает критики. Проблема в том, что плотность неадекватно дискретизируется, а не в том, что правило трапеции плохо нарушается. Объединить () бесполезно получить правильный ответ, потому что плотность () не дает правильное представление. Чтобы увидеть это, просто осмотрите xy $ x: в нем всего 512 значений, которые должны представлять 10 000 узких пиков!
whuber

@ whuber, вот что сказал ответ. Дело в том, что вам нужно использовать правило трапеции для конечного числа выборок, и оно переоценивает площадь по сравнению с истинной плотностью на непрерывной оси в соответствии с ядрами. Мое обновление в конце вопроса расширяет его.
highBandWidth

1
@ высокое нет; Трапециевидное правило работает нормально. Проблема в том, что он работает с неверной дискретизацией подынтегрального выражения. Вы не можете иметь «много узких пиков, соответствующих точкам данных», когда в массиве плотности 10 000 точек данных и только 512 значений!
whuber

1
Глядя на эти графики, я теперь думаю, что проблема densityскорее с , чем с integrate.xy. При N = 10000 и мт = 1E6, вы должны увидеть расческу с высотой каждого зуба около 1E6, и зубов является более плотной вокруг 0. Вместо этого вы все еще видите узнаваемую колоколообразной кривой. Так densityчто изменяет вам, или, по крайней мере, его следует использовать по-другому с крошечной пропускной способностью: nдолжно быть около (диапазон данных) / (bw), а не по умолчанию n=512. Интегратор должен подобрать одно из этих огромных значений, которое densityвозвращается по несчастному совпадению.
StasK

-1

Это нормально, вы можете исправить это, сдвигая и масштабируя; добавьте наименьшее число так, чтобы плотность была неотрицательной, а затем умножьте все это на константу, так что площадь будет равна единице. Это простой способ.

L2с[φ(Икс)-с]+


2
Обратите внимание , что речь идет скорее о почемуdensity функция не дает «правильный» плотность , которая интегрируется в 1 - а затем о том , как это исправить.
Тим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.