Explique o aviso do ggplot2: “K linhas removidas contendo valores ausentes”

89

Recebo este aviso quando tento gerar um gráfico com ggplot .

Depois de pesquisar online por um tempo, muitos sugeriram que meu banco de dados contém valores nulos ou dados ausentes em geral, o que não era o caso.

Nesta pergunta, a resposta aceita diz o seguinte:

O aviso significa que alguns elementos são removidos porque estão fora do intervalo especificado

Eu queria saber o que exatamente esse intervalo se refere e como alguém pode aumentar esse intervalo manualmente para evitar todos os avisos?

ksm001
fonte
5
Há um limite no yeixo dessa questão. Os valores são limitados entre 0 e 0,12 devido a esta função:ylim(0,0.12)
LyzandeR
1
Um exemplo reproduzível ajudaria a responder à pergunta. @LyzandeR parece estar indo no caminho certo.
vpipkt de

Respostas:

85

O comportamento que você está vendo é devido ao modo como ggplot2lida com os dados que estão fora dos intervalos do eixo do gráfico. Você pode alterar este comportamento dependendo se você usa scale_y_continuous(ou, de forma equivalente, ylim) ou coord_cartesianpara definir intervalos de eixo, conforme explicado abaixo.

library(ggplot2)

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

No código a seguir, um ponto com hp = 335 está fora do intervalo y do gráfico. Além disso, como costumávamos scale_y_continuousdefinir o intervalo do eixo y, esse ponto não é incluído em nenhuma outra estatística ou medida de resumo calculada por ggplot, como a linha de regressão linear.

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).

No código a seguir, o ponto com hp = 335 ainda está fora do intervalo y do gráfico, mas esse ponto está incluído em quaisquer estatísticas ou medidas de resumo que ggplot calcula, como a linha de regressão linear. Isso é porque usamoscoord_cartesian definir o intervalo do eixo y, e esta função não exclui pontos que estão fora dos intervalos do gráfico quando ela faz outros cálculos nos dados.

Se você comparar este gráfico com o anterior, pode ver que a linha de regressão linear no segundo gráfico tem uma inclinação ligeiramente mais acentuada, porque o ponto com hp = 335 é incluído ao calcular a linha de regressão, embora não seja visível no gráfico .

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

Só pelo shake completando a resposta dada pelo eipi10.

Eu estava enfrentando o mesmo problema, sem usar scale_y_continuousnem coord_cartesian.

O conflito estava vindo do eixo x, onde eu defini limits = c(1, 30). Parece que esses limites não fornecem espaço suficiente se você quiser "desviar" de suas barras, então R ainda gera o erro

8 linhas removidas contendo valores ausentes (geom_bar)

Ajustando os limites do eixo x para limits = c(0, 31)resolver o problema.

Em conclusão, mesmo se você não estiver colocando limites em seu eixo y, verifique o comportamento do eixo x para garantir que você tenha espaço suficiente

Davidnortes
fonte
Isso é freqüentemente esquecido. Pela mesma pessoa. Novamente depois de algum tempo ... suspiro Obrigado!
Genom
1

Mesmo que seus dados caiam dentro de seus limites especificados (por exemplo c(0, 335)), adicionar uma geom_jitter()instrução pode empurrar alguns pontos para fora desses limites, produzindo a mesma mensagem de erro.

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).

Criado em 2020-08-24 pelo pacote reprex (v0.3.0)

Todd
fonte
0

Eu também encontrei isso, mas no caso em que eu queria evitar as mensagens de erro extras, mantendo o intervalo fornecido. Uma opção é também criar um subconjunto dos dados antes de definir o intervalo, de modo que o intervalo possa ser mantido da maneira que você quiser sem disparar avisos.

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))
Roubar
fonte