2016-04-29 2 views
0

У меня есть алгоритм, который использует график x, y отсортированных данных y для создания огива.R: область под кривой огни?

Затем я получаю область под кривой для получения%.

Я хотел бы сделать что-то подобное, используя оценку плотности ядра. Мне нравится, как верхняя/нижняя границы сглаживаются с использованием плотностей ядра (т. Е. Min и max немного расширяются за пределы жесткого кодированного ввода).

В любом случае ... Мне было интересно, есть ли способ относиться к огню как к типу кумулятивной функции распределения и/или использовать оценку плотности ядра для получения кумулятивной функции распределения с учетом данных y?

Прошу прощения, если это путаный вопрос. Я знаю, что есть способ получить кумулятивный график частоты (т. Е. Ogive). Однако я не могу определить, как получить%, учитывая этот кумулятивный график частоты.

Что я не хочу, это ecdf. Я знаю, как это сделать, и я не совсем пытаюсь захватить ecdf. Но, скорее, интеграция огни с учетом двух интервалов.

+1

Если бы легче дать конкретные советы, если у вас есть какие-то [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a- замечательный r-воспроизводимый пример) – MrFlick

+0

Несмотря на ваши протесты против, я думаю, что вы пытаетесь изобрести функцию 'ecdf' как промежуточную для своей цели. Конечным результатом будет просто «ecdf (dat) (point2) - ecdf (dat) (point1)». –

ответ

2

Я не совсем уверен, что вы имеете в виду, но вот способ вычислить площадь под кривой для оценки плотности ядра (или, более общо, для любого случая, когда у вас есть значения y на равноотстоящих x- значения (хотя вы можете, конечно, обобщать различные интервалы х, а)):

library(zoo) 

# Kernel density estimate 
# Set n to higher value to get a finer grid 
set.seed(67839) 
dens = density(c(rnorm(500,5,2),rnorm(200,20,3)), n=2^5) 

# How to extract the x and y values of the density estimate 
#dens$y 
#dens$x 

# x interval 
dx = median(diff(dens$x)) 

# mean height for each pair of y values 
h = rollmean(dens$y, 2) 

# Area under curve 
sum(h*dx) # 1.000943 

# Cumulative area 
# cumsum(h*dx) 

# Plot density, showing points at which density is calculated 
plot(dens) 
abline(v=dens$x, col="#FF000060", lty="11") 

enter image description here

# Plot cumulative area under curve, showing mid-point of each x-interval 
plot(dens$x[-length(dens$x)] + 0.5*dx, cumsum(h*dx), type="l") 
abline(v=dens$x[-length(dens$x)] + 0.5*dx, col="#FF000060", lty="11") 

enter image description here

UPDATE, чтобы включить функцию ecdf

Чтобы адресовать ваши комментарии, посмотрите на два участка ниже. Первая - эмпирическая функция кумулятивного распределения (ECDF) смеси нормальных распределений, которые я использовал выше. Обратите внимание, что график этих данных выглядит так же, как и выше. Второй - график ECDF обычного нормального распределения ванили, среднее значение = 0, sd = 1.

set.seed(67839) 
x = c(rnorm(500,5,2),rnorm(200,20,3)) 
plot(ecdf(x), do.points=FALSE) 

plot(ecdf(rnorm(1000))) 

enter image description here

+0

спасибо. Есть ли способ сделать это с самой плотностью? Я не уверен, что мне это нужно, но подумал, что я спрошу. – thistleknot

+0

Как упоминалось в [42], кажется, что вам нужен график совокупной плотности: 'plot (ecdf (rnorm (1000))). – eipi10

+0

, но ecdf всегда дает 45-градусный угол, когда он кумулятивный. Это никогда не выглядит как cdf, на вашей картинке это выглядит как (хотя и странно) cdf. И снова ecdf не будет расширять края, как это сделано с графиком плотности (который использует оценку плотности ядра). – thistleknot

Смежные вопросы