2017-03-21 4 views
0

Comment tracer les fonctions CDF et Quantile, dans R, si j'ai le PDF. À l'heure actuelle, je donne les résultats suivants (mais je pense qu'il doit y avoir une meilleure façon de le faire):Tracé des fonctions CDF et quantile Étant donné le PDF

## Probability Density Function 
p <- function(x) { 
    result <- (x^2)/9 
    result[x < 0 | x > 3] <- 0 
    result 
} 

plot(p, xlim = c(0,3), main="Probability Density Function") 

## Cumulative Distribution Function 
F <- function(a = 0,b){ 
    result <- ((b^3)/27) - ((a^3)/27) 
    result[a < 0 ] <- 0 
    result[b > 3] <- 1 
    result 
} 

plot(F(,x), xlim=c(0,3), main="Cumulative Distribution Function") 

## Quantile Function 
Finv <- function(p) { 
    3*x^(1/3) 
} 
+1

Peut-être utiles: ':: Statistiques integrate' – dash2

+0

Vous pourriez également regarder' bibliothèque (Ryacas) '' ou bibliothèque (Rsympy) ' – dash2

+0

Il est un peu difficile de ce que vous recherchez. Je veux dire, il semble que vous sachiez déjà que pour passer d'un pdf à un cdf, vous devez intégrer. Toutes les fonctions ne sont pas facilement intégrables. Votre fonction a une solution analytique. Est-ce la valeur que vous voulez retourner? Ou êtes-vous simplement intéressé par les approximations numériques pour tout pdf en général? R ne comprend pas vraiment les statistiques; il a juste de nombreuses fonctions statistiques intégrées. – MrFlick

Répondre

2

Comme @ dash2 suggéré, le CDF aurait besoin de vous pour intégrer le PDF, en substance, vous besoin de trouver la zone sous la courbe.

Voici une solution générique qui devrait vous aider. J'utilise une distribution gaussienne à titre d'exemple - vous devriez pouvoir lui fournir n'importe quelle fonction générique.

Notez que les quantiles rapportés sont des approximations seulement. En outre, n'oubliez pas de regarder dans la documentation pour integrate().

# CDF Function 
CDF <- function(FUNC = p, plot = T, area = 0.5, LOWER = -10, UPPER = 10, SIZE = 1000){ 

    # Create data 
    x <- seq(LOWER, UPPER, length.out = SIZE) 
    y <- p(x) 

    area.vec <- c() 
    area.vec[1] <- 0 

    for(i in 2:length(x)){ 
     x.vec <- x[1:i] 
     y.vec <- y[1:i] 

     area.vec[i] = integrate(p, lower = x[1], upper = x[i])$value 
    } 

    # Quantile 
    quantile = x[which.min(abs(area.vec - area))] 

    # Plot if requested 
    if(plot == TRUE){ 

     # PDF 
     par(mfrow = c(1, 2)) 
     plot(x, y, type = "l", main = "PDF", col = "indianred", lwd = 2) 
     grid() 

     # CDF 
     plot(x, area.vec, type = "l", main = "CDF", col = "slateblue", 
      xlab = "X", ylab = "CDF", lwd = 2) 

     # Quantile 
     mtext(text = paste("Quantile at ", area, "=", 
          round(quantile, 3)), side = 3) 
     grid() 

     par(mfrow = c(1, 1)) 
    } 
} 

# Sample data 
# PDF Function - Gaussian distribution 
p <- function(x, SD = 1, MU = 0){ 
    y <- (1/(SD * sqrt(2*pi)) * exp(-0.5 * ((x - MU)/SD)^2)) 
    return(y) 
} 

# Call to function 
CDF(p, area = 0.5, LOWER = -5, UPPER = 5) 

enter image description here