Bagaimana cara menambahkan garis tren non-linear ke sebaran plot di R? [Tutup]

27

Saya punya plot pencar. Bagaimana saya bisa menambahkan garis tren non-linear?

Karina Khusainova
sumber
4
Apakah Anda sudah memiliki persamaan kurva tren atau apakah menambahkannya termasuk menghitung persamaannya dari data?
Whuber

Jawaban:

34

Mari kita buat beberapa data.

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

Berikut ini menunjukkan bagaimana Anda dapat menyesuaikan garis loess atau kecocokan regresi non-linear.

plot (y ~ x, Data)

# cocokkan garis loess
loess_fit <- loess (y ~ x, Data)
baris (Data $ x, prediksi (loess_fit), col = "blue")

# cocok dengan regresi non-linear
nls_fit <- nls (y ~ a + b * x ^ (- c), Data, mulai = daftar (a = 80, b = 20, 
    c = 0,2))
baris (Data $ x, prediksi (nls_fit), col = "red")

sebidang chunk export_plot

Jeromy Anglim
sumber
1
tentang merencanakan, bagi mereka yang mengalami masalah pesanan, saran ini berguna
tflutre
23

Jika Anda menggunakan ggplot2(sistem plot ketiga, dalam R, setelah basis R dan kisi), ini menjadi:

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

merencanakan

Anda dapat memilih bagaimana data dihaluskan: lihat ?stat_smoothdetail dan contoh.

Vincent Zoonekynd
sumber
Grafik dan penjelasan yang bagus! Tapi apa artinya area bayangan?
Darwin PC
3
Area yang diarsir adalah interval kepercayaan di sekitar garis yang dihaluskan. Anda bisa menemukannya sendiri dengan mengakses file bantuan R stat_smoothdengan mengetik ?stat_smoothseperti kata Vincent. :-)
Saya Suka Kode
9

Tanpa tahu persis apa yang Anda cari, menggunakan latticepaket Anda dapat dengan mudah menambahkan kurva loess type="smooth"; misalnya,

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

Lihat help("panel.loess")argumen yang dapat diteruskan ke rutinitas loess fitting untuk mengubah, misalnya, tingkat polinomial yang akan digunakan.

masukkan deskripsi gambar di sini

Memperbarui

Untuk mengubah warna kurva loess, Anda dapat menulis fungsi kecil dan meneruskannya sebagai panelparameter ke 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)

masukkan deskripsi gambar di sini

Jason Morgan
sumber
bagaimana Anda membuat garis warna yang berbeda?
EngrStudent
1
@ EngrStudent Saya memperbarui jawaban saya.
Jason Morgan
8

Pertanyaan Anda agak kabur, jadi saya akan membuat beberapa asumsi tentang apa masalah Anda. Ini akan banyak membantu jika Anda bisa memasang sebar dan gambarkan data sedikit. Tolong, jika saya membuat asumsi yang buruk maka abaikan jawaban saya.

Pertama, mungkin data Anda menggambarkan beberapa proses yang menurut Anda wajar adalah non-linear. Misalnya, jika Anda mencoba melakukan regresi pada jarak untuk mobil berhenti dengan pengereman mendadak vs kecepatan mobil, fisika memberi tahu kita bahwa energi kendaraan sebanding dengan kuadrat kecepatan - bukan kecepatan diri. Jadi, Anda mungkin ingin mencoba regresi polinomial dalam kasus ini, dan (dalam R) Anda dapat melakukan sesuatu seperti model <- lm(d ~ poly(v,2),data=dataset). Ada banyak dokumentasi tentang cara memasukkan berbagai non-linearitas ke dalam model regresi.

Di sisi lain, jika Anda memiliki garis yang "goyah" dan Anda tidak tahu mengapa itu goyah, maka titik awal yang baik mungkin adalah regresi tertimbang secara lokal, atau loessdalam R. Ini melakukan regresi linier pada kecil wilayah, yang bertentangan dengan seluruh dataset. Paling mudah untuk membayangkan versi "k terdekat-tetangga", di mana untuk menghitung nilai kurva pada titik mana pun, Anda menemukan titik k terdekat dengan tempat tujuan, dan rata-rata. Loess memang seperti itu tetapi menggunakan regresi bukannya rata-rata lurus. Untuk ini, gunakan model <- loess(y ~ x, data=dataset, span=...), di mana spanvariabel mengontrol tingkat perataan.

Di pihak ketiga (kehabisan tangan) - Anda berbicara tentang tren? Apakah ini masalah sementara? Jika ya, berhati-hatilah dengan menafsirkan garis tren dan signifikansi statistik secara berlebihan. Tren dalam deret waktu dapat muncul dalam proses "autoregresif", dan untuk proses ini keacakan proses kadang-kadang dapat membuat tren keluar dari kebisingan acak, dan uji signifikansi statistik yang salah dapat memberi tahu Anda itu signifikan ketika tidak!

Patrick Caldon
sumber
6

Menempatkan titik sampel plot sebaran dan kurva halus pada grafik yang sama:

  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

Plot pencar dengan kurva halus

Jim Robertson
sumber