es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tramando diferentes modelos para diferentes rangos de valores de x en ggplot().

Estoy intentando mostrar un modelo lineal para valores bajos de x y un modelo no lineal para valores más altos de x. Para hacer esto, usaré DNase como ejemplo:

library(ggplot2)

Asignando DNase como un nuevo dataframe:

data_1 <- DNase

Creando una columna que puede distinguir los valores de rango bajo y alto:

data_1$range <- ifelse(data_1$conc < 5, "bajo", "alto")

Intentando trazar líneas separadas para los valores de rango bajo y alto, y también facet_wrap según la ejecución:

ggplot(data_1, aes(x = conc, y = density, colour = range)) +
  geom_point(size = 0.5) + stat_smooth(method = "nls", 
                                       method.args = list(formula = y ~ a*exp(b*x),
                                                          start = list(a = 0.8, b = 0.1)), 
                                       data = data_1,
                                       se = FALSE) + 
  stat_smooth(method = 'lm', formula = 'y~0+x') + 
  facet_wrap(~Run)

Sin embargo, como puedes ver, parece trazar tanto el modelo lineal como el modelo no lineal para ambos, y no puedo entender exactamente dónde poner la información que le indique que solo trace uno para cada uno. Además, si es posible, ¿puedo extender estos modelos al rango completo de valores en el eje x?

Imagen: enlace a la imagen

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar un modelo lineal para valores x bajos y un modelo no lineal para valores x altos, se puede utilizar la función ifelse() para asignar una columna de rango que distinga entre valores de rango bajo y alto. Luego, se utiliza la función stat_smooth() con el argumento method establecido en “lm” para el modelo lineal y “nls” para el modelo no lineal. Para extender los modelos a todo el rango de valores en el eje x, se utiliza la función expand_limits(). Para trazar solo un modelo para cada rango, se elimina una de las funciones stat_smooth() y se ajusta la función geom_smooth() en consecuencia. Aquí hay un ejemplo con DNase:

    “`{r}
    library(ggplot2)

    Asignando DNase como un nuevo dataframe:

    data_1 <- DNase

    Creando una columna que pueda distinguir entre valores de rango bajo y alto:

    data_1$range <- ifelse(data_1$conc < 5, “bajo”, “alto”)

    Tramando líneas separadas para valores de rango bajo y alto, y también facet_wrap por Run:

    ggplot(data_1, aes(x = conc, y = density, colour = range)) +
    geom_point(size = 0.5) +
    stat_smooth(aes(group = range),
    method = “nls”,
    formula = y ~ aexp(bx),
    method.args = list(start = list(a = 0.8, b = 0.1)),
    data = subset(data_1, range == “alto”),
    se = FALSE) +
    stat_smooth(aes(group = range),
    method = “lm”,
    formula = y ~ x,
    data = subset(data_1, range == “bajo”),
    se = FALSE) +
    facet_wrap(~ Run) +
    expand_limits(x = c(0, 80))
    “`

    Este código mostrará un modelo no lineal para valores x altos y un modelo lineal para valores x bajos, cada modelo se mostrará solo una vez para cada rango. La función expand_limits() extiende el rango del eje x para mostrar el rango completo de valores.

Comments are closed.