Explica la advertencia de ggplot2: "Se quitaron k filas que contienen valores faltantes"

89

Recibo esta advertencia cuando intento generar una trama con ggplot.

Después de investigar en línea durante un tiempo, muchos sugirieron que mi base de datos contiene valores nulos o datos faltantes en general, lo que no era el caso.

En esta pregunta, la respuesta aceptada dice lo siguiente:

La advertencia significa que algunos elementos se eliminan porque caen fuera del rango especificado

Me preguntaba a qué se refiere exactamente este rango y cómo puede alguien aumentar manualmente este rango para evitar todas las advertencias.

ksm001
fuente
5
Hay un límite en el yeje de esa cuestión. Los valores están limitados entre 0 y 0.12 debido a esta función:ylim(0,0.12)
LyzandeR
1
Un ejemplo reproducible ayudaría a responder la pregunta. @LyzandeR parece ir por el buen camino.
vpipkt

Respuestas:

85

El comportamiento que está viendo se debe a cómo se ggplot2manejan los datos que están fuera de los rangos de los ejes del gráfico. Puede cambiar este comportamiento dependiendo de si usa scale_y_continuous(o, de manera equivalente, ylim) o coord_cartesianpara establecer rangos de eje, como se explica a continuación.

library(ggplot2)

# All points are visible in the plot
ggplot(mtcars, aes(mpg, hp)) + 
  geom_point()

En el siguiente código, un punto con hp = 335 está fuera del rango y del gráfico. Además, debido a que solíamos scale_y_continuousestablecer el rango del eje y, este punto no se incluye en ninguna otra estadística o medida de resumen calculada por ggplot, como la línea de regresión lineal.

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,335) and the warning disappars
  geom_smooth(method="lm")

Warning messages:
1: Removed 1 rows containing missing values (stat_smooth). 
2: Removed 1 rows containing missing values (geom_point).

En el siguiente código, el punto con hp = 335 todavía está fuera del rango y del gráfico, pero este punto se incluye, no obstante, en cualquier estadística o medida de resumen que calcula ggplot, como la línea de regresión lineal. Esto se debe a que solíamos coord_cartesianestablecer el rango del eje y, y esta función no excluye los puntos que están fuera de los rangos del gráfico cuando realiza otros cálculos sobre los datos.

Si compara este y el gráfico anterior, puede ver que la línea de regresión lineal en el segundo gráfico tiene una pendiente ligeramente más pronunciada, porque el punto con hp = 335 se incluye al calcular la línea de regresión, aunque no es visible en el gráfico. .

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")
eipi10
fuente
11

Solo por la sacudida completando la respuesta dada por eipi10.

Estaba enfrentando el mismo problema, sin usar scale_y_continuousni coord_cartesian.

El conflicto venía del eje x, donde lo definí limits = c(1, 30). Parece que tales límites no brindan suficiente espacio si desea "esquivar" sus barras, por lo que R aún arroja el error

Se eliminaron 8 filas que contienen valores faltantes (geom_bar)

Ajustando los límites del eje x para limits = c(0, 31)solucionar el problema.

En conclusión, incluso si no está poniendo límites a su eje y, verifique su comportamiento en el eje x para asegurarse de tener suficiente espacio

Davidnortes
fuente
Esto a menudo se pasa por alto. Por la misma persona. De nuevo después de un tiempo ... suspiro ¡Gracias!
Genom
1

Incluso si sus datos caen dentro de sus límites especificados (por ejemplo c(0, 335)), agregar una geom_jitter()declaración podría empujar algunos puntos fuera de esos límites, produciendo el mismo mensaje de error.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))


# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

Creado el 2020-08-24 por el paquete reprex (v0.3.0)

Todd
fuente
0

También me encontré con esto, pero en el caso en el que quería evitar los mensajes de error adicionales mientras mantenía el rango proporcionado. Una opción es también crear un subconjunto de los datos antes de establecer el rango, de modo que el rango se pueda mantener como desee sin activar advertencias.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))
Robar
fuente