Estoy creando un diagrama de facetas para ver los valores predichos frente a los reales al lado de un diagrama del valor predicho frente a los residuos. Lo usaré shiny
para ayudar a explorar los resultados de los esfuerzos de modelado utilizando diferentes parámetros de entrenamiento. Entreno el modelo con el 85% de los datos, pruebo el 15% restante y repito esto 5 veces, recopilando valores reales / previstos cada vez. Después de calcular los residuos, mi se data.frame
ve así:
head(results)
act pred resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825 1.69175252
4 54.58667 49.00482 5.58184181
5 36.23333 35.52386 0.70947731
6 53.22667 48.79429 4.43237981
7 41.72333 41.57504 0.14829173
Lo que quiero:
- Gráfico lado a lado de
pred
vs.act
ypred
vs.resid
- El rango / límites x / y para
pred
vs.act
sea el mismo, idealmente demin(min(results$act), min(results$pred))
amax(max(results$act), max(results$pred))
- El rango / límites x / y para
pred
vs.resid
no se verá afectado por lo que hago con la trama real vs. predicha. Trazarx
solo los valores predichos yy
solo el rango residual está bien.
Para ver ambas gráficas una al lado de la otra, derrito los datos:
library(reshape2)
plot <- melt(results, id.vars = "pred")
Ahora traza:
library(ggplot2)
p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")
print(p)
Eso es bastante parecido a lo que quiero:
Lo que me gustaría es que los rangos xey para el valor real frente al predicho sean iguales, pero no estoy seguro de cómo especificar eso, y no necesito que se haga para el gráfico predicho vs residual ya que el los rangos son completamente diferentes.
Intenté agregar algo como esto para ambos scale_x_continous
y scale_y_continuous
:
min_xy <- min(min(plot$pred), min(plot$value))
max_xy <- max(max(plot$pred), max(plot$value))
p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")
p <- p + scale_x_continuous(limits = c(min_xy, max_xy))
p <- p + scale_y_continuous(limits = c(min_xy, max_xy))
print(p)
Pero eso recoge min()
los valores residuales.
Una última idea que tuve es almacenar el valor del mínimo act
y las pred
variables antes de la fusión, y luego agregarlas al marco de datos fundido para dictar en qué faceta aparecen:
head(results)
act pred resid
2 52.81000 52.86750 -0.05750133
3 44.46000 42.76825 1.69175252
4 54.58667 49.00482 5.58184181
5 36.23333 35.52386 0.70947731
min_xy <- min(min(results$act), min(results$pred))
max_xy <- max(max(results$act), max(results$pred))
plot <- melt(results, id.vars = "pred")
plot <- rbind(plot, data.frame(pred = c(min_xy, max_xy),
variable = c("act", "act"), value = c(max_xy, min_xy)))
p <- ggplot(plot, aes(x = pred, y = value)) + geom_point(size = 2.5) + theme_bw()
p <- p + facet_wrap(~variable, scales = "free")
print(p)
Eso hace lo que quiero, con la excepción de que los puntos también aparecen:
¿Alguna sugerencia para hacer algo como esto?
Vi esta idea para agregar geom_blank()
, pero no estoy seguro de cómo especificar el aes()
bit y hacer que funcione correctamente, o cuál es el geom_point()
equivalente al uso del histograma aes(y = max(..count..))
.
Aquí hay datos para jugar (mis valores reales, predichos y residuales antes de la fusión):
> dput(results)
structure(list(act = c(52.81, 44.46, 54.5866666666667, 36.2333333333333,
53.2266666666667, 41.7233333333333, 35.2966666666667, 30.6833333333333,
39.25, 35.8866666666667, 25.1, 29.0466666666667, 23.2766666666667,
56.3866666666667, 42.92, 41.57, 27.92, 23.16, 38.0166666666667,
61.8966666666667, 37.41, 41.6333333333333, 35.9466666666667,
48.9933333333333, 30.5666666666667, 32.08, 40.3633333333333,
53.2266666666667, 64.6066666666667, 38.5366666666667, 41.7233333333333,
25.78, 33.4066666666667, 27.8033333333333, 39.3266666666667,
48.9933333333333, 25.2433333333333, 32.67, 55.17, 42.92, 54.5866666666667,
23.16, 64.6066666666667, 40.7966666666667, 39.0166666666667,
41.6333333333333, 35.8866666666667, 25.1, 23.2766666666667, 44.46,
34.2166666666667, 40.8033333333333, 24.5766666666667, 35.73,
61.8966666666667, 62.1833333333333, 74.6466666666667, 39.4366666666667,
36.6, 27.1333333333333), pred = c(52.8675013282404, 42.7682474758679,
49.0048248585123, 35.5238560262515, 48.7942868566949, 41.5750416040131,
33.9548164913007, 29.9787449128663, 37.6443975781139, 36.7196211666685,
27.6043278172077, 27.0615724310721, 31.2073056885252, 55.0886903524179,
43.0895814712768, 43.0895814712768, 32.3549865881578, 26.2428426737583,
36.6926037128343, 56.7987490221996, 45.0370788180147, 41.8231642271826,
38.3297859332601, 49.5343916620086, 30.8535641206809, 29.0117492750411,
36.9767968381391, 49.0826677983065, 54.4678549541069, 35.5059204731218,
41.5333417555995, 27.6069075391361, 31.2404889715121, 27.8920960978598,
37.8505531149324, 49.2616631533957, 30.366837650159, 31.1623492639066,
55.0456078770405, 42.772538591063, 49.2419293590535, 26.1963523976241,
54.4080781796616, 44.9796700541254, 34.6996927469131, 41.6227713664027,
36.8449646519306, 27.5318686661673, 31.6641793552795, 42.8198894266632,
40.5769177148146, 40.5769177148146, 29.3807781312816, 36.8579132935989,
55.5617033901752, 55.8097119335638, 55.1041728261666, 43.6094641699075,
37.0674887276681, 27.3876960746536), resid = c(-0.0575013282403773,
1.69175252413213, 5.58184180815435, 0.709477307081826, 4.43237980997177,
0.148291729320228, 1.34185017536599, 0.704588420467079, 1.60560242188613,
-0.832954500001826, -2.50432781720766, 1.98509423559461, -7.93063902185855,
1.29797631424874, -0.169581471276786, -1.51958147127679, -4.43498658815778,
-3.08284267375831, 1.32406295383237, 5.09791764446704, -7.62707881801468,
-0.189830893849219, -2.38311926659339, -0.541058328675241, -0.286897454014273,
3.06825072495888, 3.38653649519422, 4.14399886836018, 10.1388117125598,
3.03074619354486, 0.189991577733821, -1.82690753913609, 2.16617769515461,
-0.088762764526507, 1.47611355173427, -0.268329820062384, -5.12350431682565,
1.5076507360934, 0.124392122959534, 0.147461408936991, 5.34473730761318,
-3.03635239762411, 10.1985884870051, -4.18300338745873, 4.31697391975358,
0.0105619669306023, -0.958297985263961, -2.43186866616734, -8.38751268861282,
1.64011057333683, -6.36025104814794, 0.226415618518729, -4.80411146461488,
-1.1279132935989, 6.33496327649151, 6.37362139976954, 19.5424938405001,
-4.17279750324084, -0.467488727668119, -0.254362741320246)), .Names = c("act",
"pred", "resid"), row.names = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L,
10L, 11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L,
38L, 39L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L,
52L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L
), class = "data.frame")
grid.arrange
.ggplot(plot, aes(x = pred, y = value)) + geom_point()
postfundidos , que lo haría sin facetas? ¿No reduciría eso realmente la escala de los residuos para dificultar la detección de no aleatoriedad / sesgo?variable
valor creado pormelt()
. Por otra parte, supongo que podría almacenarlos en una lista creada porlapply
para trazar varias combinaciones. Gracias por el aporte. Si desea crear unagrid
solución, puedo aceptar la respuesta, aunque si esa es la ruta que tomamos, también podría ser un duplicado de las otrasgrid
soluciones.grid.arrange
que casi invariablemente estropea el diseño. Ojalá se corrigieran los errores de larga data de gtable.Respuestas:
Aquí hay un código con una
geom_blank
capa ficticia ,fuente
expand_limits(pred=range_act, value=range_act)
, que usageom_blank
pero es más simple de usar.No estoy seguro de entender lo que quieres, pero basándome en lo que entendí
la escala x parece ser la misma, es la escala y la que no es la misma, y eso se debe a que especificó escalas = "gratis"
puede especificar escalas = "free_x" para permitir que x sea libre (en este caso es lo mismo que pred tiene el mismo rango por definición)
funcionó para mí, mira la foto
Creo que lo estabas poniendo demasiado difícil; me parece recordar una vez que definí los límites en función de una fórmula con mínimo y máximo y, si está facetado, creo que usó solo esos valores, pero no puedo encontrar el código
fuente
También puede especificar el rango con el comando coord_cartesian para establecer el rango del eje y que desee, como en la publicación anterior, use scale = free_x
fuente