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
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ónstat_smooth()
con el argumentomethod
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ónexpand_limits()
. Para trazar solo un modelo para cada rango, se elimina una de las funcionesstat_smooth()
y se ajusta la funcióngeom_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.