2017-03-21 8 views
0

PDF가있는 경우 CDF 및 Quantile 함수를 R로 어떻게 그릴 수 있습니까? 현재, 나는 다음이 (하지만 난 그것을 할 수있는 더 좋은 방법이있을 생각) : dash2 제안PDF가 주어진 경우 CDF 및 Quantile 함수 플로팅

## 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

+0

integrate' 또한 라이브러리 (Ryacas)'또는'라이브러리 (Rsympy)'에서 볼 수있는' – dash2

+0

그것의 종류의 불분명 당신이 후에 무엇. 제 말은 pdf에서 통합해야하는 cdf로 이동하는 것을 이미 알고있는 것처럼 보입니다. 모든 기능이 쉽게 통합 될 수있는 것은 아닙니다. 귀하의 기능에는 분석 솔루션이 있습니다. 이것은 당신이 돌려주고 싶은 가치입니까? 아니면 일반적으로 모든 PDF에 대한 수치 근사값에 관심이 있습니까? R은 실제로 통계를 이해하지 못합니다. 그것은 단지 많은 통계 함수를 내장하고 있습니다. – MrFlick

답변

2

@으로, CDF 당신이 찾을 필요 본질적으로, PDF를 통합 할 필요가있다 곡선 아래 영역.

다음은 일반적인 해결책입니다. 예를 들어 가우스 분포를 사용하고 있습니다. 일반적인 함수를 피드 할 수 있어야합니다.

보고되는 quantile은 대략적인 값입니다. 또한 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