D'abord, faites quelques données à utiliser. Ici, nous allons regarder la largeur de pétale de deux espèces végétales de l'ensemble de données intégré iris
.
## Some sample data from iris
dat <- droplevels(with(iris, iris[Species %in% c("versicolor", "virginica"), ]))
## make a similar graph
library(ggplot2)
ggplot(dat, aes(Petal.Width, fill=Species)) +
geom_density(alpha=0.5)
Pour trouver la zone de l'intersection, vous pouvez utiliser approxfun
pour approcher la fonction décrivant le chevauchement. Ensuite, intégrez-le pour obtenir la zone. Puisque ce sont des courbes de densité, leur aire est 1 (ish), donc l'intégrale sera le pourcentage de chevauchement.
## Get density curves for each species
ps <- lapply(split(dat, dat$Species), function(x) {
dens <- density(x$Petal.Width)
data.frame(x=dens$x, y=dens$y)
})
## Approximate the functions and find intersection
fs <- sapply(ps, function(x) approxfun(x$x, x$y, yleft=0, yright=0))
f <- function(x) fs[[1]](x) - fs[[2]](x) # function to minimize (difference b/w curves)
meet <- uniroot(f, interval=c(1, 2))$root # intersection of the two curves
## Find overlapping x, y values
ps1 <- is.na(cut(ps[[1]]$x, c(-Inf, meet)))
ps2 <- is.na(cut(ps[[2]]$x, c(Inf, meet)))
shared <- rbind(ps[[1]][ps1,], ps[[2]][ps2,])
## Approximate function of intersection
f <- with(shared, approxfun(x, y, yleft=0, yright=0))
## have a look
xs <- seq(0, 3, len=1000)
plot(xs, f(xs), type="l", col="blue", ylim=c(0, 2))
points(ps[[1]], col="red", type="l", lty=2, lwd=2)
points(ps[[2]], col="blue", type="l", lty=2, lwd=2)
polygon(c(xs, rev(xs)), y=c(f(xs), rep(0, length(xs))), col="orange", density=40)
## Integrate it to get the value
integrate(f, lower=0, upper=3)$value
# [1] 0.1548127
Si vous êtes intéressé par les différences de groupe d'une certaine mesure (dans l'image liée, il serait b e 'poids'), alors pourquoi ne pas simplement faire un test t? –
Il semble que vous pourriez vouloir consulter un statisticien plutôt qu'un programmeur ici en fonction de vos besoins de données. Si votre question concerne la recherche d'un test ou d'une méthode d'estimation statistiquement appropriée, alors vous devriez vous renseigner sur [stats.se]. Si vous savez quel test vous voulez effectuer mais que vous ne savez pas comment le faire en R, alors vous devriez éditer votre question pour le rendre plus clair. – MrFlick