วิธีเพิ่มเส้นแนวโน้มที่ไม่ใช่เชิงเส้นในพล็อตกระจายใน R ได้อย่างไร [ปิด]


27

ฉันมีแผนกระจาย ฉันจะเพิ่มเส้นแนวโน้มที่ไม่ใช่เชิงเส้นได้อย่างไร


4
คุณมีสมการของเส้นโค้งแนวโน้มหรือไม่หรือการเพิ่มมันรวมถึงการคำนวณสมการจากข้อมูลหรือไม่?
whuber

คำตอบ:


34

มาสร้างข้อมูลกันบ้าง

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

ล็อตของ chunk export_plot


1
เกี่ยวกับการวางแผนสำหรับผู้ที่ปัญหาเพื่อพบคำแนะนำนี้จะเป็นประโยชน์
tflutre

23

หากคุณใช้ggplot2(ระบบการพล็อตที่สามใน R หลังจากฐาน R และตาข่าย) สิ่งนี้จะกลายเป็น:

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

พล็อต

คุณสามารถเลือกว่าข้อมูลจะราบรื่นได้อย่างไร: ดู?stat_smoothรายละเอียดและตัวอย่าง


กราฟและคำอธิบายที่ดี! แต่พื้นที่เงาหมายถึงอะไร
ดาร์วินพีซี

3
พื้นที่แรเงาคือช่วงความมั่นใจรอบ ๆ เส้นที่ราบเรียบ คุณสามารถค้นพบสิ่งนี้ได้ด้วยตัวเองโดยเข้าถึงไฟล์วิธีใช้ R stat_smoothโดยพิมพ์?stat_smoothตามที่ Vincent ระบุ :-)
ฉันชอบ Code

9

โดยไม่ทราบว่าสิ่งที่คุณกำลังมองหาการใช้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)

ป้อนคำอธิบายรูปภาพที่นี่


คุณจะทำให้เส้นแตกต่างกันอย่างไร?
EngrStudent - Reinstate Monica

1
@EngrStudent ฉันได้รับคำตอบของฉันแล้ว
Jason Morgan

8

คำถามของคุณค่อนข้างคลุมเครือดังนั้นฉันจะตั้งสมมติฐานว่าปัญหาของคุณคืออะไร มันจะช่วยได้มากถ้าคุณใส่ scatterplot และอธิบายข้อมูลได้เล็กน้อย ได้โปรดถ้าฉันตั้งสมมติฐานไม่ดีแล้วก็เพิกเฉยต่อคำตอบของฉัน

ขั้นแรกเป็นไปได้ว่าข้อมูลของคุณอธิบายถึงกระบวนการบางอย่างที่คุณเชื่อว่ามีเหตุผล ตัวอย่างเช่นหากคุณกำลังพยายามถดถอยระยะทางที่รถจะหยุดด้วยการเบรกอย่างกะทันหันเทียบกับความเร็วของรถฟิสิกส์บอกเราว่าพลังงานของยานพาหนะนั้นแปรผันตามกำลังสองของความเร็วไม่ใช่ความเร็ว ตัวเอง ดังนั้นคุณอาจต้องการลองการถดถอยพหุนามในกรณีนี้และ (ใน R) คุณสามารถทำอะไรmodel <- lm(d ~ poly(v,2),data=dataset)ได้บ้าง มีเอกสารจำนวนมากเกี่ยวกับวิธีนำเส้นตรงที่ไม่เป็นเชิงเส้นต่าง ๆ ลงในแบบจำลองการถดถอย

ในทางกลับกันถ้าคุณมีบรรทัดที่ "สั่นคลอน" และคุณไม่รู้ว่าทำไมมันสั่นคลอนแล้วจุดเริ่มต้นที่ดีอาจจะเป็นการถ่วงน้ำหนักในพื้นที่หรือloessในอาร์นี่เป็นการถดถอยเชิงเส้นตรงขนาดเล็ก ภูมิภาคซึ่งตรงข้ามกับชุดข้อมูลทั้งหมด เป็นการง่ายที่สุดที่จะจินตนาการว่าเป็นรุ่น "k เพื่อนบ้านที่ใกล้เคียงที่สุด" ซึ่งจะคำนวณค่าของเส้นโค้ง ณ จุดใด ๆ คุณจะพบจุด k ที่ใกล้เคียงที่สุดกับจุดสนใจและหาค่าเฉลี่ย ดินเหลืองเป็นเช่นนั้น แต่ใช้การถดถอยแทนที่จะเป็นค่าเฉลี่ยแบบตรง สำหรับสิ่งนี้ใช้model <- loess(y ~ x, data=dataset, span=...)ที่spanตัวแปรควบคุมระดับของการปรับให้เรียบ

ในมือที่สาม (วิ่งออกจากมือ) - คุณกำลังพูดถึงแนวโน้ม? นี่เป็นปัญหาทางโลกหรือไม่ ถ้าเป็นเช่นนั้นให้ใช้ความระมัดระวังเล็กน้อยกับการตีความเส้นแนวโน้มและนัยสำคัญทางสถิติ แนวโน้มในอนุกรมเวลาสามารถปรากฏในกระบวนการ "autoregressive" และสำหรับกระบวนการเหล่านี้การสุ่มของกระบวนการสามารถสร้างแนวโน้มจากสัญญาณรบกวนแบบสุ่มและการทดสอบนัยสำคัญทางสถิติที่ไม่ถูกต้องสามารถบอกคุณได้ว่ามันสำคัญเมื่อไม่มี!


6

การวางจุดตัวอย่างพล็อตกระจายและเส้นโค้งเรียบบนกราฟเดียวกัน

  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

พล็อตกระจายที่มีเส้นโค้งเรียบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.