Come aggiungere una linea di tendenza non lineare a un diagramma a dispersione in R? [chiuso]


27

Ho un diagramma a dispersione. Come posso aggiungere una linea di tendenza non lineare?


4
Hai già l'equazione della curva di tendenza o aggiungerla include calcolare l'equazione dai dati?
whuber

Risposte:


34

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

trama di blocco export_plot


1
sulla trama, per chi ha problemi di ordine, questo consiglio è utile
tflutre

23

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

tracciare

Puoi scegliere il modo in cui i dati vengono livellati: vedi ?stat_smoothper dettagli ed esempi.


Bel grafico e spiegazione! Ma cosa significa l'area d'ombra?
Darwin PC

3
L'area ombreggiata è l'intervallo di confidenza attorno alla linea smussata. Avresti potuto scoprirlo da solo accedendo al file della guida di R stat_smoothdigitando ?stat_smoothcome ha affermato Vincent. :-)
Mi piace scrivere l'

9

Senza sapere esattamente cosa stai cercando, usando il latticepacchetto 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.

inserisci qui la descrizione dell'immagine

Aggiornare

Per cambiare il colore della curva del loess, puoi scrivere una piccola funzione e passarla come panelparametro 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)

inserisci qui la descrizione dell'immagine


come vorresti rendere la linea di un colore diverso?
EngrStudent - Ripristina Monica

1
@EngrStudent Ho aggiornato la mia risposta.
Jason Morgan,

8

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 loessin 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 spanvariabile 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 è!


6

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

Grafico a dispersione con curva liscia

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.