Saya punya plot pencar. Bagaimana saya bisa menambahkan garis tren non-linear?
Saya punya plot pencar. Bagaimana saya bisa menambahkan garis tren non-linear?
Jawaban:
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")
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()
Anda dapat memilih bagaimana data dihaluskan: lihat ?stat_smooth
detail dan contoh.
stat_smooth
dengan mengetik ?stat_smooth
seperti kata Vincent. :-)
Tanpa tahu persis apa yang Anda cari, menggunakan lattice
paket 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.
Memperbarui
Untuk mengubah warna kurva loess, Anda dapat menulis fungsi kecil dan meneruskannya sebagai panel
parameter 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)
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 loess
dalam 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 span
variabel 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!
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