2017-01-28 4 views
2

Как я могу получить область с перекрывающимися кривыми плотности?вычислить площадь перекрывающегося участка плотности по ggplot, используя R

Как я могу решить проблему с R? (Существует решение для питона здесь: Calculate overlap area of two functions)

set.seed(1234) 
df <- data.frame(
    sex=factor(rep(c("F", "M"), each=200)), 
    weight=round(c(rnorm(200, mean=55, sd=5), 
       rnorm(200, mean=65, sd=5))) 
) 

(Источник: http://www.sthda.com/english/wiki/ggplot2-density-plot-quick-start-guide-r-software-and-data-visualization)

ggplot(df, aes(x=weight, color=sex, fill=sex)) + 
geom_density(aes(y=..density..), alpha=0.5) 

«Точка, используемая в графике возвращается ggplot_build(), так что вы можете получить доступ к ним. " Итак, теперь у меня есть точки, и я могу их накормить, но проблема в том, что я не знаю, как вычесть функции плотности.

Любая помощь очень ценится! (И я верю в высокий спрос, нет решения для этого легко доступны.)

+0

выдает ошибку: 'брт <- ggplot (ДФ, АЕС (х = вес, цвет = пол, заполнить = пол)) + geom_density (АЕС (у = .. плотность ..), alpha = 0.5) DPB <- ggplot_build (брт) x1 <- мин (что (DPB $ данных [[1]] $ х> = 50)) х2 <- макс (который (DPB $ данных [[1 ]] $ x <= 70)) grt + geom_area (data = data.frame (x = dpb $ data [[1]] $ x [x1: x2], \t y = данные dpb $ [[1] ] $ y [x1: x2]), aes (x = x, y = y), fill = "gray") ' – user5878028

+0

возможно это http://stats.stackexchange.com/questions/97596/how-to-calculate -однослойная-между-эмпирическая-вероятность-плотность может помочь – MLavoie

+0

Спасибо, хорошо выглядит. Однако, из-за перемасштабирования, могу ли я получить вероятность пересечения? Попробуй сейчас. – user5878028

ответ

1

Я сделаю несколько базовых участков R, но графики на самом деле не являются частью решения . Они просто там, чтобы подтвердить, что я получаю правильный ответ .

Вы можете получить каждую из функций плотности и решить, где они пересекаются.

## Create the two density functions and display 
FDensity = approxfun(density(df$weight[df$sex=="F"], from=40, to=80)) 
MDensity = approxfun(density(df$weight[df$sex=="M"], from=40, to=80)) 
plot(FDensity, xlim=c(40,80), ylab="Density") 
curve(MDensity, add=TRUE) 

Решая для пересечения

## Solve for the intersection and plot to confirm 
FminusM = function(x) { FDensity(x) - MDensity(x) } 
Intersect = uniroot(FminusM, c(40, 80))$root 
points(Intersect, FDensity(Intersect), pch=20, col="red") 

Intersection of density plots

Теперь мы можем просто интегрировать, чтобы получить площадь перекрытия.

integrate(MDensity, 40,Intersect)$value + 
    integrate(FDensity, Intersect, 80)$value 
[1] 0.2952838 
+0

Это работает только для одного перекрестка, правильно? Таким образом, 0,29 означает, что 30% мужчин и женщин имеют одинаковый вес, правильно? – user5878028

+0

Только что выяснил, что мой график плотности, используя мои реальные данные, колеблется, хотя я не вижу его, потому что соотношение 1: 10000 между тем, что я вижу, и колебаниями. Однако, если оба распределения плотности кажутся плоской линией при y = 0,00 ... 1, на самом деле существует миллион перекрытий микроскопического масштаба. Черт. Попытка workaorund путем ограничения пересечения с плотностью> средняя (плотность) * 0.01 – user5878028

+0

@ user5878028 Нет, это не значит, что 30% имеют одинаковый вес. Это означает, что у 30% есть вес, который более типичен для противоположного пола. То есть 12% мужчин имеют вес, который более типичен для женщин, а 17 женщин имеют вес, типичный для мужчин. WRT несколько пересечений, вы правы. это решение предполагало одно пересечение. – G5W

0

Я искал способ сделать это для эмпирических данных, и имел проблему многочисленных пересечений, как упоминаемый user5878028. Через некоторое рытье я нашел очень простое решение, даже для общего R нуб как я:

установить и загрузить библиотеки «перекрывающихся» (который выполняет вычисление) и «решетки» (который отображает результат):

library(overlapping) 
library(lattice) 

Затем определите переменную «x» как список, содержащий два распределения плотности, которые вы хотите сравнить. Для этого примера, два набора данных «data1» и «data2» являются столбцы в текстовом файле с именем «yourfile»:

x <- list(X1=yourfile$data1, X2=yourfile$data2) 

Тогда просто сказать ему, чтобы отобразить результат в виде графика, который будет также отображать оцененный % наложения:

out <- overlap(x, plot=TRUE) 

Я надеюсь, что это поможет кому-то, как это помогло мне! Вот пример перекрытия участка

overlapping plot

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