Построение графиков CDF и квантильных функций с учетом PDF

Как бы я нарисовал функции CDF и Quantile, в R, если у меня есть 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 ответ

Как предположил @dash2, CDF потребует от вас интеграции PDF, в сущности, вам нужно найти область под кривой.

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

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

Другие вопросы по тегам