ฉันมีแผนกระจาย ฉันจะเพิ่มเส้นแนวโน้มที่ไม่ใช่เชิงเส้นได้อย่างไร
ฉันมีแผนกระจาย ฉันจะเพิ่มเส้นแนวโน้มที่ไม่ใช่เชิงเส้นได้อย่างไร
คำตอบ:
มาสร้างข้อมูลกันบ้าง
n <- 100 x <- seq (n) y <- rnorm (n, 50 + 30 * x ^ (- 0.2), 1) ข้อมูล <- data.frame (x, y)
ข้อมูลต่อไปนี้แสดงวิธีที่คุณสามารถใส่เส้นเหลืองหรือการถดถอยแบบไม่เชิงเส้น
พล็อต (y ~ x, Data) # พอดีกับเส้นเหลือง loess_fit <- เหลือง (y ~ x, Data) บรรทัด (ข้อมูล $ x, คาดการณ์ (loess_fit), col = "blue") # พอดีกับการถดถอยเชิงเส้น nls_fit <- nls (y ~ a + b * x ^ (- c), Data, start = list (a = 80, b = 20, c = 0.2)) บรรทัด (ข้อมูล $ x, คาดการณ์ (nls_fit), col = "red")
หากคุณใช้ggplot2
(ระบบการพล็อตที่สามใน R หลังจากฐาน R และตาข่าย) สิ่งนี้จะกลายเป็น:
library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()
คุณสามารถเลือกว่าข้อมูลจะราบรื่นได้อย่างไร: ดู?stat_smooth
รายละเอียดและตัวอย่าง
stat_smooth
โดยพิมพ์?stat_smooth
ตามที่ Vincent ระบุ :-)
โดยไม่ทราบว่าสิ่งที่คุณกำลังมองหาการใช้lattice
แพคเกจที่คุณสามารถเพิ่มโค้งเหลืองด้วยtype="smooth"
; เช่น,
> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))
ดูhelp("panel.loess")
อาร์กิวเมนต์ที่สามารถส่งผ่านไปยังรูทีนการปรับขนาดเหมาะสมเพื่อเปลี่ยนตัวอย่างเช่นระดับของพหุนามที่จะใช้
ปรับปรุง
ในการเปลี่ยนสีของเส้นโค้งเหลืองคุณสามารถเขียนฟังก์ชั่นขนาดเล็กและส่งเป็นpanel
พารามิเตอร์เพื่อ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)
คำถามของคุณค่อนข้างคลุมเครือดังนั้นฉันจะตั้งสมมติฐานว่าปัญหาของคุณคืออะไร มันจะช่วยได้มากถ้าคุณใส่ scatterplot และอธิบายข้อมูลได้เล็กน้อย ได้โปรดถ้าฉันตั้งสมมติฐานไม่ดีแล้วก็เพิกเฉยต่อคำตอบของฉัน
ขั้นแรกเป็นไปได้ว่าข้อมูลของคุณอธิบายถึงกระบวนการบางอย่างที่คุณเชื่อว่ามีเหตุผล ตัวอย่างเช่นหากคุณกำลังพยายามถดถอยระยะทางที่รถจะหยุดด้วยการเบรกอย่างกะทันหันเทียบกับความเร็วของรถฟิสิกส์บอกเราว่าพลังงานของยานพาหนะนั้นแปรผันตามกำลังสองของความเร็วไม่ใช่ความเร็ว ตัวเอง ดังนั้นคุณอาจต้องการลองการถดถอยพหุนามในกรณีนี้และ (ใน R) คุณสามารถทำอะไรmodel <- lm(d ~ poly(v,2),data=dataset)
ได้บ้าง มีเอกสารจำนวนมากเกี่ยวกับวิธีนำเส้นตรงที่ไม่เป็นเชิงเส้นต่าง ๆ ลงในแบบจำลองการถดถอย
ในทางกลับกันถ้าคุณมีบรรทัดที่ "สั่นคลอน" และคุณไม่รู้ว่าทำไมมันสั่นคลอนแล้วจุดเริ่มต้นที่ดีอาจจะเป็นการถ่วงน้ำหนักในพื้นที่หรือloess
ในอาร์นี่เป็นการถดถอยเชิงเส้นตรงขนาดเล็ก ภูมิภาคซึ่งตรงข้ามกับชุดข้อมูลทั้งหมด เป็นการง่ายที่สุดที่จะจินตนาการว่าเป็นรุ่น "k เพื่อนบ้านที่ใกล้เคียงที่สุด" ซึ่งจะคำนวณค่าของเส้นโค้ง ณ จุดใด ๆ คุณจะพบจุด k ที่ใกล้เคียงที่สุดกับจุดสนใจและหาค่าเฉลี่ย ดินเหลืองเป็นเช่นนั้น แต่ใช้การถดถอยแทนที่จะเป็นค่าเฉลี่ยแบบตรง สำหรับสิ่งนี้ใช้model <- loess(y ~ x, data=dataset, span=...)
ที่span
ตัวแปรควบคุมระดับของการปรับให้เรียบ
ในมือที่สาม (วิ่งออกจากมือ) - คุณกำลังพูดถึงแนวโน้ม? นี่เป็นปัญหาทางโลกหรือไม่ ถ้าเป็นเช่นนั้นให้ใช้ความระมัดระวังเล็กน้อยกับการตีความเส้นแนวโน้มและนัยสำคัญทางสถิติ แนวโน้มในอนุกรมเวลาสามารถปรากฏในกระบวนการ "autoregressive" และสำหรับกระบวนการเหล่านี้การสุ่มของกระบวนการสามารถสร้างแนวโน้มจากสัญญาณรบกวนแบบสุ่มและการทดสอบนัยสำคัญทางสถิติที่ไม่ถูกต้องสามารถบอกคุณได้ว่ามันสำคัญเมื่อไม่มี!
การวางจุดตัวอย่างพล็อตกระจายและเส้นโค้งเรียบบนกราฟเดียวกัน
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