2010-10-06 33 views
4

J'ai deux courbes de densité tracées en utilisant ceci:Calculer une aire sous une courbe continue densité

Network <- Mydf$Networks 
quartiles <- quantile(Mydf$Avg.Position, probs=c(25,50,75)/100) 
density <- ggplot(Mydf, aes(x = Avg.Position, fill = Network)) 
d <- density + geom_density(alpha = 0.2) + xlim(1,11) + opts(title = "September 2010") + geom_vline(xintercept = quartiles, colour = "red") 
print(d) 

Je voudrais calculer la surface sous chaque courbe pour une plage de Avg.Position donné. Un peu comme pnorm pour la courbe normale. Des idées?

Répondre

10

Calculez la densité séparément et tracez celle avec laquelle commencer. Ensuite, vous pouvez utiliser l'arithmétique de base pour obtenir l'estimation. Une intégration est approximée en additionnant la surface d'un ensemble de petits carrés. J'utilise la méthode moyenne pour cela. la longueur est la différence entre deux valeurs x, la hauteur est la moyenne de la valeur y au début et à la fin de l'intervalle. J'utilise la fonction rollmeans dans le paquet zoo, mais cela peut aussi être fait en utilisant le paquet de base.

require(zoo) 

X <- rnorm(100) 
# calculate the density and check the plot 
Y <- density(X) # see ?density for parameters 
plot(Y$x,Y$y, type="l") #can use ggplot for this too 
# set an Avg.position value 
Avg.pos <- 1 

# construct lengths and heights 
xt <- diff(Y$x[Y$x<Avg.pos]) 
yt <- rollmean(Y$y[Y$x<Avg.pos],2) 
# This gives you the area 
sum(xt*yt) 

Cela vous donne une bonne approximation jusqu'à 3 chiffres derrière le signe décimal. Si vous connaissez la fonction de densité, jetez un oeil à ?integrate

4

Trois possibilités:

Le paquet logspline fournit une autre méthode d'estimation des courbes de densité, mais il inclut des fonctions de style pnorm pour le résultat.

Vous pouvez également approcher la zone en transmettant les variables x et y renvoyées par la fonction de densité à la fonction approximative et en utilisant le résultat avec la fonction d'intégration. À moins que vous ne soyez intéressé par des estimations précises de petites zones de queue (ou de très petits intervalles), cela donnera probablement une approximation raisonnable.

Les estimations de densité ne sont que la somme des noyaux centrés sur les données, un tel noyau est juste la distribution normale. Vous pouvez faire la moyenne des zones de pnorm (ou d'autres noyaux) avec le sd défini par la bande passante et centré sur vos données.