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

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

Как решить проблему с R? (Здесь есть решение для python: Рассчитать область перекрытия двух функций)

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-dedensity-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 (), поэтому вы можете получить к ним доступ». Итак, теперь у меня есть очки, и я могу скормить их приблизительно, но моя проблема в том, что я не знаю, как вычесть функции плотности.

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


person user5878028    schedule 28.01.2017    source источник
comment
выдает ошибку: grt <- ggplot(df, aes(x=weight, color=sex, fill=sex)) + geom_density(aes(y=..density..), alpha=0.5) dpb <- ggplot_build(grt) x1 <- min(which(dpb$data[[1]]$x >=50)) x2 <- max(which(dpb$data[[1]]$x <=70)) grt + geom_area(data=data.frame(x=dpb$data[[1]]$x[x1:x2], y=dpb$data[[1]]$y[x1:x2]),aes(x=x, y=y), fill="grey")   -  person user5878028    schedule 28.01.2017
comment
возможно, этот stats.stackexchange.com/questions/97596/ может помочь   -  person MLavoie    schedule 28.01.2017
comment
Спасибо, все хорошо. Однако могу ли я получить вероятность пересечения из-за изменения масштаба? Сейчас попробую.   -  person user5878028    schedule 28.01.2017


Ответы (2)


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

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

library(overlapping)
library(lattice)

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

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

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

out <- overlap(x, plot=TRUE)

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

перекрывающийся сюжет

person Karop    schedule 02.02.2018

Я сделаю несколько базовых графиков 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")

Пересечение графиков плотности

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

integrate(MDensity, 40,Intersect)$value + 
    integrate(FDensity, Intersect, 80)$value
[1] 0.2952838
person G5W    schedule 28.01.2017
comment
Это работает только для одного перекрестка, верно? Итак, 0,29 означает, что 30% мужчин и женщин имеют одинаковый вес, верно? - person user5878028; 29.01.2017
comment
Только что выяснил, что мой график плотности с использованием моих реальных данных колеблется, хотя я его не вижу, потому что соотношение между тем, что я вижу, и колебанием составляет 1: 10000. Однако, если оба распределения плотности кажутся плоской линией при y = 0,00 ... 1, на самом деле существует миллион перекрытий микроскопического масштаба. Черт. Попытка трудоустройства, ограничивая пересечение плотностью ›среднее (плотность) * 0,01 - person user5878028; 29.01.2017
comment
@ user5878028 Нет, это не значит, что 30% имеют одинаковый вес. Это означает, что 30% имеют вес, более характерный для противоположного пола. Т.е. 12% мужчин имеют вес, более типичный для женщин, и 17% женщин имеют вес, типичный для мужчин. WRT несколько перекрестков, вы правы. это решение предполагало единственное пересечение. - person G5W; 29.01.2017
comment
Могли бы вы сказать, что у 30% населения невозможно определить, является ли человек женщиной или мужчиной, если вам известен только вес? - person user5878028; 29.01.2017
comment
Что ж, для 100% населения вы не можете определить пол по весу. Это говорит о том, что если вы предсказываете пол на основе наиболее вероятного пола для данного веса, вы будете делать ошибку в 30% случаев. - person G5W; 29.01.2017