stat_function normal ggplot density and r plot ggplot2 weibull

normal - r plot weibull distribution



Cómo escalar/transformar gráficos:: trama() ejes con cualquier transformación, no solo logarítmica(para trazados Weibull)? (1)

Si bien no parece ser posible en gráficos base, puede hacer que esta función haga lo que desee para que pueda llamarla de manera más simple:

F0inv <- function (p) log(qweibull(p, 1, 1)) ## this is the transformation function F0 <- function (q) exp(-exp(q)) weibullplot <- function(eta, beta, ticks=c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01)), ...) { ## the curve of this function represents the weibull distribution ## as a straight line on weibull paper weibull2 <- function(x) F0inv(pweibull(x, beta, eta)) curve(weibull2, xlim=c(100, 1e4), ylim=F0inv(c(0.01, 0.99)), log="x", axes=FALSE) axis(1); axis(2, at=F0inv(ticks), labels=ticks) abline(h=F0inv(ticks),col="lightgray") } weibullplot(eta=1000, beta=2)

Estoy construyendo un paquete R para mostrar gráficas de Weibull (usando graphics::plot ) en R. La gráfica tiene un eje x transformado por registro y un eje y transformado por Weibull (a falta de una mejor descripción). La distribución Weibull de dos parámetros se puede representar como una línea recta en este gráfico.

La transformación logarítmica del eje x es tan simple como agregar el parámetro log="x" a plot() o curve() . ¿Cómo puedo suministrar la transformación del eje y de una manera elegante, para que todos los gráficos relacionados con el trazado funcionen en mi diagrama transformado en eje? Para demostrar lo que necesito, ejecute el siguiente código de ejemplo:

## initialisation ## beta <- 2;eta <- 1000 ticks <- c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01)) F0inv <- function (p) log(qweibull(p, 1, 1)) # this is the transformation function F0 <- function (q) exp(-exp(q)) # this is the inverse of the transformation function weibull <- function(x)pweibull(x,beta,eta) # the curve of this function represents the weibull distribution # as a straight line on weibull paper weibull2 <- function(x)F0inv(weibull(x))

Primero un ejemplo de una distribución de Weibull con beta=2 y eta=1000 en una trama regular no transformada:

## untransformed axes ## curve(weibull ,xlim=c(100,1e4),ylim=c(0.01,0.99)) abline(h=ticks,col="lightgray")

Esta trama es inútil para el análisis de Weibull. Aquí está mi solución actualmente implementada que transforma los datos con la función F0inv() y modifica el eje y de la gráfica. Tenga en cuenta que tengo que usar F0inv() en todos los datos relacionados con el eje y .

## transformed axis with F0inv() ## curve(weibull2,xlim=c(100,1e4),ylim=F0inv(c(0.01,0.99)),log="x",axes=F) axis(1);axis(2,at=F0inv(ticks),labels=ticks) abline(h=F0inv(ticks),col="lightgray")

Esto funciona, pero esto no es muy fácil de usar: cuando el usuario quiere agregar anotaciones, uno siempre debe usar F0inv() :

text(300,F0inv(0.4),"at 40%")

Descubrí que puede lograr una solución a mi problema usando ggplot2 y escalas, pero no quiero cambiar a un paquete de gráficos a menos que sea absolutamente necesario ya que muchos otros códigos deben ser reescritos.

## with ggplot2 and scales ## library(ggplot2) library(scales) weibull_trans <- function()trans_new("weibull", F0inv, F0) qplot(c(100,1e4),xlim=c(100,1e4),ylim=c(0.01,0.99), stat="function",geom="line",fun=weibull) + coord_trans(x="log10",y = "weibull")

Creo que si pudiera reemplazar dinámicamente el código para aplicar la transformación logarítmica con el mío, mi problema estaría resuelto.

Intenté encontrar más información buscando en Google "Transformación del eje R", "Coordenadas del usuario R", "Escalado del eje R" sin resultados útiles. Casi todo lo que he encontrado trata de escalas logarítmicas.

Traté de ver en el plot() cómo funciona el parámetro log="x" , pero el código relevante para plot.window está escrito en C, no es mi punto más fuerte.