Eu tenho um gráfico de dispersão. Como posso adicionar uma linha de tendência não linear?
Eu tenho um gráfico de dispersão. Como posso adicionar uma linha de tendência não linear?
Respostas:
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")
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()
Você pode escolher como os dados são suavizados: veja ?stat_smooth
para detalhes e exemplos.
stat_smooth
digitando ?stat_smooth
como Vincent afirmou. :-)
Sem saber exatamente o que você está procurando, usando o lattice
pacote 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.
Atualizar
Para alterar a cor da curva de loess, você pode escrever uma função pequena e passá-la como um panel
parâ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)
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 loess
em 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 span
variá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 é!
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