rggplot2statisticshazard

Basic Calculations with stat_functions -- Plotting hazard functions


I am currently trying to plot some density distributions functions with R's ggplot2. I have the following code:

f <- stat_function(fun="dweibull",
                   args=list("shape"=1),
                             "x" = c(0,10))
stat_F <- stat_function(fun="pweibull",
                   args=list("shape"=1),
                             "x" = c(0,10))
S <- function() 1 - stat_F

h <- function() f / S
wei_h <- ggplot(data.frame(x=c(0,10))) +
         stat_function(fun=h) +
         ...

Basically I want to plot hazard functions based on a Weibull Distribution with varying parameters, meaning I want to plot:

https://i.sstatic.net/w2nlZ.gif

The above code gives me this error:

Computation failed in stat_function(): unused argument (x_trans)

I also tried to directly use

S <- 1 - stat_function(fun="pweibull", ...)

instead of above "workaround" with the custom function construction. This threw another error, since I was trying to do numeric arithmetics on an object:

non-numeric argument for binary operator

I get that error, but I have no idea for a solution.

I have done some research, but without success. I feel like this should be straightforward. Also I would like to do it "manually" as much as possible, but if there is no simple way to do this, then a packaged solution is just fine aswell.

Thanks in advance for any suggestions!

PS: I basically want to recreate the graph you can find in Kiefer, 1988 on page 10 of the linked PDF file.


Solution

  • Three comments:

    1. stat_function is a function statistic for ggplot2, you cannot divide two stat_function expressions by each other or otherwise use them in mathematical expressions, as in S <- 1 - stat_function(fun="pweibull", ...). That's a fundamental misunderstanding of what stat_function is. stat_function always needs to be added to a ggplot2 plot, as in the example below.

    2. The fun argument for stat_function takes a function as an argument, not a string. You can define functions on the fly if you need ones that don't exist already.

    3. You need to set up an aesthetic mapping, via the aes function.

    This code works:

    args = list("shape" = 1.2)
    ggplot(data.frame(x = seq(0, 10, length.out = 100)), aes(x)) + 
      stat_function(fun = dweibull, args = args, color = "red") +
      stat_function(fun = function(...){1-pweibull(...)}, args = args, color = "green") +
      stat_function(fun = function(...){dweibull(...)/(1-pweibull(...))},
                    args = args, color = "blue")
    

    enter image description here