Як я можу оцінити щільність нульового завищеного параметра в R?


10

У мене є набір даних з великою кількістю нулів, який виглядає приблизно так:

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

Я хотів би намалювати лінію за її щільністю, але density()функція використовує рухоме вікно, яке обчислює негативні значення x.

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

Є density(... from, to)аргументи, але вони, здається, лише скорочують обчислення, а не змінюють вікно, щоб щільність на 0 відповідала даним, як це видно з наступного сюжету:

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

(якби інтерполяція була змінена, я б очікував, що чорна лінія матиме більшу щільність на 0, ніж сіра лінія)

Чи є альтернативи цій функції, які б забезпечили кращий розрахунок щільності при нулі?

введіть тут опис зображення

Відповіді:


14

Щільність нескінченна нулю, оскільки вона включає дискретний шип. Потрібно оцінити шип за допомогою частки нулів, а потім оцінити позитивну частину щільності, вважаючи, що вона гладка. KDE викличе проблеми в лівій частині, оскільки додасть певної ваги негативним значенням. Один корисний підхід - це перетворення в журнали, оцінка щільності за допомогою KDE, а потім перетворення назад. Дивіться Wand, Marron & Ruppert (JASA 1991) для ознайомлення.

Наступна функція R буде виконувати перетворену щільність:

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

Тоді наведено потрібний сюжет:

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.

введіть тут опис зображення


Дякую за вашу відповідь, але я розгублений - ви кажете "оцініть колосок за допомогою пропорції нулів", але побудуйте його без меж. чи має колосок дискретної висоти чи він нескінченний, якщо дискретний, це ? P(X=0)
Абе

Це суміш дискретного розподілу та безперервного розподілу. Якщо побудовано як щільність, шип нескінченний (насправді дельта-функція Дірака). Іноді люди будують дискретну частину як функцію масової ймовірності (тому тоді шип має висоту ), а безперервну частину як функцію щільності. Це, мабуть, робить кращим візуальне, але воно включає дві різні шкали. P(X=0)
Роб Хайндман

це стане в нагоді. fyi: виходить, що, хоча bw = "SJ" впливає на щільність у непроформованому просторі, logdensity однакова, використовуючи "SJ" та за замовчуванням "nrd0" ... Я збираюся прочитати посилання на SJ: "Sheather and Jones (1991) Надійний метод вибору пропускної здатності на основі даних для оцінки щільності ядра ". jstor.org/stable/2345597
Абе

4

Я погодився би з Роб Хайндманом, що вам потрібно розібратися з нулями окремо. Існує кілька методів боротьби з оцінкою щільності ядра змінної з обмеженою підтримкою, включаючи "відображення", "ренормалізацію" та "лінійну комбінацію". Вони, здається, не були реалізовані у densityфункції R , але вони доступні в пакеті Бенна Дженна kdensдля Stata .


1

Інший варіант, коли у вас є дані з логічною нижньою межею (наприклад, 0, але можуть бути інші значення), що ви знаєте, що дані не будуть йти нижче, і звичайна оцінка щільності ядра розміщує значення нижче цієї межі (або якщо у вас є верхня межа або те і інше) полягає у використанні оцінок logspline. Пакет logspline для R реалізує ці, а функції мають аргументи для визначення меж, тому оцінка буде виходити на межу, але не виходить за межі та все-таки шкалою до 1.

Існують також методи ( oldlogsplineфункція), які враховують інтервальну цензуру, тому якщо ці 0 не є точними 0, але округлені так, що ви знаєте, що вони представляють значення між 0 та деяким іншим числом (наприклад, межа виявлення), то ви може надати цю інформацію функції підгонки.

Якщо додаткові 0 - це істинні 0 (не округлені), то кращим підходом є оцінка шипу чи точкової маси, але їх також можна поєднувати з оцінкою лосплейна лінії.


0

Ви можете спробувати зменшити пропускну здатність (синя лінія призначена для adjust=0.5), введіть тут опис зображення

але, ймовірно, KDE - це не найкращий метод боротьби з такими даними.


чи є інший метод, який ви б рекомендували?
Абе

@Abe Ну, це залежить від того, що ти хочеш зробити ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.