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_smoothpara detalhes e exemplos.
stat_smoothdigitando ?stat_smoothcomo Vincent afirmou. :-)
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.

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)

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 é!
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
