Хороші методи для графіків щільності негативних змінних в R?


36
plot(density(rexp(100))

Очевидно, вся щільність зліва від нуля являє собою зміщення.

Я хочу узагальнити деякі дані для нестатистів, і хочу уникати запитань про те, чому невід’ємні дані мають щільність зліва від нуля. Ділянки призначені для перевірки рандомізації; Я хочу показати розподіл змінних за групами лікування та контролю. Розподіл часто є експоненціальними. Гістограми складні з різних причин.

Швидкий пошук у Google дає мені роботу статистиків над негативними ядрами, наприклад: це .

Але чи було реалізовано що-небудь в R? Чи реалізований із реалізованих методів якийсь із них "найкращий" для описової статистики?

EDIT: навіть якщо fromкоманда може вирішити мою поточну проблему, було б непогано знати, чи хтось реалізував ядра на основі літератури з оцінки негативної щільності


3
Не те, про що ви запитуєте, але я б не застосовував оцінку щільності ядра до того, що повинно бути експоненціальним, особливо для представлення нестатистичним аудиторіям. Я використовував би квантильно-квантильний сюжет і пояснював, що сюжет повинен бути прямим, якби розподіл був експоненціальним.
Нік Кокс

6
plot(density(rexp(100), from=0))?
Стефан Лоран

4
Одне, що я іноді робив досить успішно, - це отримати kde на журнали, а потім перетворити оцінку щільності (не забуваючи про якобіан). Іншою можливістю буде використання оцінки щільності журналу сплайну, встановленої таким чином, щоб він знав про пов'язане.
Glen_b -Встановити Моніку


1
Я обговорював метод перетворення, згаданий @Glen_b в stata-journal.com/sjpdf.html?articlenum=gr0003 (див. Стор.76-78). Нулі можуть бути розміщені за допомогою журналу (x + 1), а не журналу та модифікації якобіан.
Нік Кокс

Відповіді:


21

Одне рішення, запозичене підходами до зважування крайових даних просторової статистики, - скорочення густини зліва при нулі, але збільшення ваги даних, найближчих до нуля. Ідея полягає в тому, що кожне значення "поширюється" в ядро ​​загальної площі одиниці з центром на x ; будь-яка частина ядра, яка перекинеться на негативну територію, видаляється, і ядро ​​перенормовується на одиницю площі.хх

Наприклад, з ядром Гаусса , вага перенормування становитьКгод(у,х)=досвід(-12((у-х)/год)2)/2π

ш(х)=1/0К(у,х)гу=11-Φх,год(0)

де - функція кумулятивного розподілу нормальної величини середнього х та стандартного відхилення h . Порівнянні формули доступні для інших ядер.Φхгод

Це простіше - і набагато швидше в обчисленні - ніж намагання звузити пропускну здатність біля . Важко прописати, як саме слід змінювати смуги пропускання біля 0 . Тим не менш, цей метод також є тимчасовим : все одно буде деяка упередженість біля 0 . Схоже, він працює краще, ніж оцінка щільності за замовчуванням. Ось порівняння з використанням великого набору даних:000

Малюнок

Синій показує щільність за замовчуванням, тоді як червоний показує щільність, скориговану для краю в . Справжній базовий розподіл простежується як пунктирна лінія для довідки.0


R код

densityФункція Rбуде скаржитися , що сума терезів не дорівнює одиниці, так як він хоче , щоб інтеграл по всіх дійсних чисел рівним одиниці, в той час як цей підхід робить інтеграл над позитивними числами , рівними одиниці. В якості перевірки останній інтеграл оцінюється як сума Рімана.

set.seed(17)
x <- rexp(1000)
#
# Compute a bandwidth.
#
h <- density(x, kernel="gaussian")$bw # $
#
# Compute edge weights.
#
w <- 1 / pnorm(0, mean=x, sd=h, lower.tail=FALSE)
#
# The truncated weighted density is what we want.
#
d <- density(x, bw=h, kernel="gaussian", weights=w / length(x))
d$y[d$x < 0] <- 0
#
# Check: the integral ought to be close to 1:
#
sum(d$y * diff(d$x)[1])
#
# Plot the two density estimates.
#
par(mfrow=c(1,1))
plot(d, type="n", main="Default and truncated densities", xlim=c(-1, 5))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)

21

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

set.seed(17)
x <- rexp(1000)

Для цього вам знадобиться пакет logspline ; встановіть його, якщо його немає:

install.packages("logspline")

Завантажте пакет і оцініть щільність за допомогою logspline()функції:

require("logspline")
m <- logspline(x)

dДалі я припускаю, що об’єкт з відповіді @ whuber присутній у робочій області.

plot(d, type="n", main="Default, truncated, and logspline densities", 
     xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)

Отриманий графік показаний нижче, при цьому щільність лонгпліналу відображається червоною лінією

Густота за замовчуванням, усічена та логічна лінія

Крім того, підтримка щільності може бути визначена через аргументи lbound та ubound. Якщо ми хочемо припустити, що щільність 0 ліворуч від 0 і є розрив у 0, ми могли б використати lbound = 0у виклику logspline(), наприклад,

m2 <- logspline(x, lbound = 0)

Подаючи наступну оцінку щільності (показано тут з оригінальним mлогплінгом, оскільки попередній показник вже зайнявся).

plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
      ylab = "Density", xlab = "x")
plot(m,  col = "red",  xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()

Отриманий сюжет показаний нижче

Порівняння оцінок щільності логічної лінії з нижньою межею на опорі

xх=0x


1
01

@whuber Добре запитання. Я нещодавно сам натрапив на цей підхід. Я підозрюю, що тут слід задати гарне запитання, оскільки методи усіченого і лонглайн-лінії є лише оцінкою справжньої щільності, чи різниці у відповідності значні, статистично? Я точно не впевнений, чому це так добре на нулі, хоча. Я би вдячний знати, чому теж.
Відновіть Моніку - Г. Сімпсон

@GavinSimpson, Дякую за гарну відповідь. Чи можете ви відтворити останній сюжет із останньою версією logspline? Для мене щільність як обмеженої, так і необмеженої версії йде до нуля при x = 0.
чел

4

Для порівняння розподілів по групах (яка, як ви говорите, є метою в одному з ваших коментарів), чому б не щось простіше? Діаграми паралельних коробок добре працюють, якщо N великий; Діаграми паралельної смуги працюють, якщо N невеликий (і обидва добре показують, що, як ви кажете, є вашими даними).


1
Так, спасибі, це працює. Але мені подобаються ділянки щільності. Вони показують більше даних, ніж боксплоти. Напевно, я здивований, що нічого, здається, вже не було здійснено. Можливо, одного дня я сам реалізую одну з цих речей. Люди, мабуть, вважають це корисним.
generic_user

1
Мені також подобаються ділянки щільності; але ви повинні врахувати свою аудиторію.
Пітер Флом - Відновіть Моніку

1
Майте погодитися з @PeterFlom на цьому. Не будьте занадто складними, якщо ваша аудиторія не має статистичних знань. Ви також можете зробити порівняльні / паралельні коробки-сюжети з накладкою ділянок метеликів зверху. Таким чином видно резюме вікна-графіку, а також усі дані.
подв.номери

Думка, що різні люди по-різному сприймають зведені сюжети, безумовно, правильна. Незважаючи на розуміння того, що таке графік щільності (і розуміючи, що це не вірогідність), я не розумію, що може бути "паралельним бокс". Він пропонує паралельний графік координат, але я підозрюю, що це неправильно.
DWin

2

Як коментарі Stéphane ви можете використовувати, from = 0і, крім того, ви можете представляти свої значення під кривою щільності за допомогоюrug (x)


4
Виправте мене, якщо я помиляюся, але from=0виглядає так, ніби це просто пригнічує графік значень нижче 0; це не виправляє обчислення того факту, що частина розподілу була намазана нижче 0.
Нік Кокс

1
Це правильно. Використовуючи fromкоманду, виходить графік, схожий на те, що має пік прямо справа від нуля. Але якщо подивитися на гістограми з постійно меншими відривами, багато даних покажуть пік AT нуля. Це fromпросто графічний трюк.
generic_user

@NickCox Я не впевнений, але не думаю, що from=0нічого пригнічує. Він просто запускає "сітку" в нуль.
Стефан Лоран

Різниця полягає в тому, чи оцінена щільність не дорівнює нулю для від'ємних значень, чи не нанесена вона чи ні. Дослідники можуть вирішити не турбуватися про це, якщо все, що вони хочуть, - це візуалізація.
Нік Кокс

@NickCox Команда не density(rexp(100), from=0)має нічого спільного з графікою
Stéphane Laurent
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.