Ho un diagramma a dispersione. Come posso aggiungere una linea di tendenza non lineare?
Ho un diagramma a dispersione. Come posso aggiungere una linea di tendenza non lineare?
Risposte:
Creiamo alcuni dati.
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0,2), 1) Dati <- data.frame (x, y)
Quanto segue mostra come è possibile adattare una linea di loess o l'adattamento di una regressione non lineare.
grafico (y ~ x, dati) # misura una linea di loess loess_fit <- loess (y ~ x, Data) righe (Dati $ x, predict (loess_fit), col = "blue") # adatta una regressione non lineare nls_fit <- nls (y ~ a + b * x ^ (- c), Dati, start = list (a = 80, b = 20, c = 0,2)) righe (Dati $ x, previsione (nls_fit), col = "rosso")
Se usi ggplot2
(il terzo sistema di tracciamento, in R, dopo la base R e il reticolo), questo diventa:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
Puoi scegliere il modo in cui i dati vengono livellati: vedi ?stat_smooth
per dettagli ed esempi.
stat_smooth
digitando ?stat_smooth
come ha affermato Vincent. :-)
Senza sapere esattamente cosa stai cercando, usando il lattice
pacchetto puoi facilmente aggiungere una curva di loess con type="smooth"
; per esempio,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
Consultare gli help("panel.loess")
argomenti che possono essere passati alla routine di adattamento loess per modificare, ad esempio, il grado del polinomio da utilizzare.
Aggiornare
Per cambiare il colore della curva del loess, puoi scrivere una piccola funzione e passarla come panel
parametro a 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)
La tua domanda è un po 'vaga, quindi farò alcune ipotesi su quale sia il tuo problema. Sarebbe molto utile se si potesse creare un diagramma a dispersione e descrivere un po 'i dati. Per favore, se sto formulando ipotesi sbagliate, ignora la mia risposta.
Innanzitutto, è possibile che i tuoi dati descrivano un processo che ritieni ragionevolmente non lineare. Ad esempio, se stai cercando di fare una regressione sulla distanza per far fermare un'auto con una frenata improvvisa rispetto alla velocità dell'auto, la fisica ci dice che l'energia del veicolo è proporzionale al quadrato della velocità, non alla velocità si. Quindi potresti voler provare la regressione polinomiale in questo caso e (in R) potresti fare qualcosa del genere model <- lm(d ~ poly(v,2),data=dataset)
. C'è molta documentazione su come inserire varie non linearità nel modello di regressione.
D'altra parte, se hai una linea che è "traballante" e non sai perché è traballante, allora un buon punto di partenza sarebbe probabilmente la regressione localmente ponderata, o loess
in R. Questo fa regressione lineare su un piccolo regione, al contrario dell'intero set di dati. È più facile immaginare una versione "k più vicina al vicino", dove calcolare il valore della curva in qualsiasi punto, trovare i k punti più vicini al punto di interesse e fare una media. Loess è proprio così, ma usa la regressione invece di una media semplice. Per questo, usa model <- loess(y ~ x, data=dataset, span=...)
, dove la span
variabile controlla il grado di livellamento.
In terza mano (a corto di mani) - stai parlando di tendenze? È un problema temporale? Se lo è, sii un po 'cauto con l'interpretazione eccessiva delle linee di tendenza e del significato statistico. Le tendenze nelle serie temporali possono apparire in processi "autoregressivi", e per questi processi la casualità del processo può occasionalmente costruire tendenze dal rumore casuale e un test di significatività statistica errato può dirti che è significativo quando non lo è!
Inserimento di punti campione del diagramma a dispersione e curva uniforme sullo stesso grafico:
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