Como adicionar uma linha de tendência não linear a um gráfico de dispersão em R? [fechadas]

27

Eu tenho um gráfico de dispersão. Como posso adicionar uma linha de tendência não linear?

Karina Khusainova
fonte
4
Você já possui a equação da curva de tendência ou a adição dela inclui o cálculo de sua equação a partir dos dados?
whuber

Respostas:

34

Vamos criar alguns dados.

n <- 100
x <- seq (n)
y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1)
Dados <- data.frame (x, y)

A seguir, mostramos como você pode ajustar uma linha de menor ou o ajuste de uma regressão não linear.

plot (y ~ x, Dados)

# encaixar uma linha loess
loess_fit <- loess (y ~ x, Dados)
linhas (dados $ x, prever (loess_fit), col = "azul")

# ajustar uma regressão não linear
nls_fit <- nls (y ~ a + b * x ^ (- c), Dados, início = lista (a = 80, b = 20, 
    c = 0,2))
linhas (dados $ x, prever (nls_fit), col = "vermelho")

plot do pedaço export_plot

Jeromy Anglim
fonte
1
sobre a trama, por esses problemas de ordem encontrando, este conselho é útil
tflutre
23

Se você usar ggplot2(o terceiro sistema de plotagem, em R, após a base R e a estrutura), isso se tornará:

library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()

enredo

Você pode escolher como os dados são suavizados: veja ?stat_smoothpara detalhes e exemplos.

Vincent Zoonekynd
fonte
Bom gráfico e explicação! Mas o que significa a área de sombra?
Darwin PC
3
A área sombreada é o intervalo de confiança em torno da linha suavizada. Você pode ter descoberto isso sozinho acessando o arquivo de ajuda do R stat_smoothdigitando ?stat_smoothcomo Vincent afirmou. :-)
Gosto de codificar
9

Sem saber exatamente o que você está procurando, usando o latticepacote você pode facilmente adicionar uma curva de loess type="smooth"; por exemplo,

> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))

Veja os help("panel.loess")argumentos que podem ser passados ​​para a rotina de ajuste menor para alterar, por exemplo, o grau do polinômio a ser usado.

insira a descrição da imagem aqui

Atualizar

Para alterar a cor da curva de loess, você pode escrever uma função pequena e passá-la como um panelparâmetro para xyplot:

x <- rnorm(100)
y <- rnorm(100)

panel_fn <- function(x, y, ...)
{
    panel.xyplot(x, y, ...)
    panel.xyplot(x, y, type="smooth", col="red", ...)
}

xyplot(y ~ x, panel=panel_fn)

insira a descrição da imagem aqui

Jason Morgan
fonte
como você tornaria a linha de uma cor diferente?
EngrStudent - Restabelece Monica 15/15
1
@EngrStudent Atualizei minha resposta.
21715 Jason Jason
8

Sua pergunta é um pouco vaga, então eu vou fazer algumas suposições sobre qual é o seu problema. Ajudaria muito se você pudesse criar um gráfico de dispersão e descrever um pouco os dados. Por favor, se estou fazendo suposições ruins, ignore minha resposta.

Primeiro, é possível que seus dados descrevam algum processo que você razoavelmente acredita não ser linear. Por exemplo, se você está tentando fazer uma regressão à distância para um carro parar com uma frenagem repentina versus a velocidade do carro, a física nos diz que a energia do veículo é proporcional ao quadrado da velocidade - não à velocidade em si. Então, você pode querer tentar a regressão polinomial neste caso, e (em R), você pode fazer algo parecido model <- lm(d ~ poly(v,2),data=dataset). Há muita documentação sobre como inserir várias não linearidades no modelo de regressão.

Por outro lado, se você tem uma linha que é "vacilante" e não sabe por que ela é vacilante, um bom ponto de partida provavelmente seria a regressão ponderada localmente ou loessem R. Isso faz a regressão linear em um pequeno região, em oposição a todo o conjunto de dados. É mais fácil imaginar uma versão "k-vizinho mais próximo", onde calcular o valor da curva a qualquer momento, você encontra os k pontos mais próximos ao ponto de interesse e faz a média deles. Loess é exatamente isso, mas usa regressão em vez de uma média direta. Para isso, use model <- loess(y ~ x, data=dataset, span=...), onde a spanvariável controla o grau de suavização.

Na terceira mão (ficando sem mãos) - você está falando de tendências? Isso é um problema temporal? Se for, seja um pouco cauteloso com a interpretação excessiva das linhas de tendência e a significância estatística. Tendências em séries temporais podem aparecer em processos "autoregressivos" e, para esses processos, a aleatoriedade do processo pode ocasionalmente criar tendências a partir de ruído aleatório, e o teste de significância estatística errado pode dizer que é significativo quando não é!

Patrick Caldon
fonte
6

Colocando pontos de amostra de plotagem de dispersão e curva suave no mesmo gráfico:

  library(graphics)
  ## Create some x,y sample points falling on hyperbola, but with error:
  xSample = seq(0.1, 1.0, 0.1)
  ySample = 1.0 / xSample
  numPts <- length(xSample)
  ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise

  ## Create x,y points for smooth hyperbola:
  xCurve <- seq(0.1, 1.0, 0.001)
  yCurve <- 1.0 / xCurve

  plot(xSample, ySample, ylim = c(0.0, 12.0))   ## Plot the sample points
  lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve

Gráfico de dispersão com curva suave

Jim Robertson
fonte