วิธีปรับข้อมูลให้ราบรื่น


14

ฉันมีข้อมูลบางอย่างที่ฉันต้องการให้ราบเรียบเพื่อให้จุดที่ราบเรียบลดลงแบบ monotonically ข้อมูลของฉันลดลงอย่างรวดเร็วจากนั้นก็เริ่มเป็นที่ราบสูง นี่คือตัวอย่างการใช้ R

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()

พล็อตข้อมูลให้ราบรื่น

เทคนิคการปรับให้เรียบแบบไหนที่ฉันสามารถใช้ได้ นอกจากนี้มันคงจะดีถ้าฉันสามารถบังคับให้จุดที่ปรับให้เรียบครั้งที่ 1 ใกล้เคียงกับจุดที่ฉันสังเกตเห็น


1
ฉันสังเกตเห็นค่าตัวอย่างของคุณเป็นจำนวนเต็ม คุณค่าที่แท้จริงของคุณมีค่าหรือไม่? ถ้าเป็นเช่นนั้น (ในขณะนี้ไม่มีการรับประกันความน่าเบื่อหน่ายสำหรับข้อมูลแบบนี้โดยทั่วไปจะให้อยู่ดี) บางสิ่งเช่นนี้อาจเป็นประโยชน์:plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Glen_b

คำถามที่คล้ายกันกับคำตอบ: stats.stackexchange.com/questions/206073/…
kjetil b halvorsen

คำตอบ:


18

คุณสามารถทำได้โดยใช้ splines ที่ถูกลงโทษพร้อมกับข้อ จำกัด แบบโมโนโทนิตี้ผ่านทางmono.con()และpcls()ฟังก์ชั่นในแพ็คเกจmgcv มีเรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับการทำเพราะฟังก์ชั่นเหล่านี้ไม่เป็นมิตรกับผู้ใช้gam()แต่มีการแสดงขั้นตอนด้านล่างซึ่งส่วนใหญ่มาจากตัวอย่างจากการ?pclsปรับเปลี่ยนเพื่อให้เหมาะกับข้อมูลตัวอย่างที่คุณให้:

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))

## Set up the size of the basis functions/number of knots
k <- 5
## This fits the unconstrained model but gets us smoothness parameters that
## that we will need later
unc <- gam(y ~ s(x, k = k, bs = "cr"), data = df)

## This creates the cubic spline basis functions of `x`
## It returns an object containing the penalty matrix for the spline
## among other things; see ?smooth.construct for description of each
## element in the returned object
sm <- smoothCon(s(x, k = k, bs = "cr"), df, knots = NULL)[[1]]

## This gets the constraint matrix and constraint vector that imposes
## linear constraints to enforce montonicity on a cubic regression spline
## the key thing you need to change is `up`.
## `up = TRUE` == increasing function
## `up = FALSE` == decreasing function (as per your example)
## `xp` is a vector of knot locations that we get back from smoothCon
F <- mono.con(sm$xp, up = FALSE)   # get constraints: up = FALSE == Decreasing constraint!

ตอนนี้เราจำเป็นต้องกรอกข้อมูลลงในวัตถุที่ได้รับการส่งผ่านไปยังpcls()มีรายละเอียดของรูปแบบการลงโทษที่เราต้องการให้พอดี

## Fill in G, the object pcsl needs to fit; this is just what `pcls` says it needs:
## X is the model matrix (of the basis functions)
## C is the identifiability constraints - no constraints needed here
##   for the single smooth
## sp are the smoothness parameters from the unconstrained GAM
## p/xp are the knot locations again, but negated for a decreasing function
## y is the response data
## w are weights and this is fancy code for a vector of 1s of length(y)
G <- list(X = sm$X, C = matrix(0,0,0), sp = unc$sp,
          p = -sm$xp, # note the - here! This is for decreasing fits!
      y = df$y,
          w = df$y*0+1)
G$Ain <- F$A    # the monotonicity constraint matrix
G$bin <- F$b    # the monotonicity constraint vector, both from mono.con
G$S <- sm$S     # the penalty matrix for the cubic spline
G$off <- 0      # location of offsets in the penalty matrix

ในที่สุดเราก็สามารถทำสิ่งที่เหมาะสมได้

## Do the constrained fit 
p <- pcls(G)  # fit spline (using s.p. from unconstrained fit)

pมี vector ของสัมประสิทธิ์สำหรับฟังก์ชันพื้นฐานที่สอดคล้องกับ spline ในการมองเห็นเส้นโค้งที่พอดีเราสามารถทำนายได้จากแบบจำลองที่ตำแหน่ง 100 แห่งในช่วงของ x เราทำค่า 100 ค่าเพื่อให้ได้เส้นที่ดีบนโครง

## predict at 100 locations over range of x - get a smooth line on the plot
newx <- with(df, data.frame(x = seq(min(x), max(x), length = 100)))

ในการสร้างค่าที่คาดการณ์ไว้เราใช้Predict.matrix()ซึ่งสร้างเมทริกซ์เช่นนั้นเมื่อค่าหลายค่าสัมประสิทธิ์pให้ค่าที่คาดการณ์จากแบบจำลองที่ประกอบ:

fv <- Predict.matrix(sm, newx) %*% p
newx <- transform(newx, yhat = fv[,1])

plot(y ~ x, data = df, pch = 16)
lines(yhat ~ x, data = newx, col = "red")

สิ่งนี้ผลิต:

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

ฉันจะปล่อยให้มันขึ้นอยู่กับคุณที่จะได้รับข้อมูลที่เป็นระเบียบเรียบร้อยสำหรับการวางแผนด้วยggplot ...

คุณสามารถบังคับแบบที่ใกล้ชิด (บางส่วนตอบคำถามของคุณเกี่ยวกับการมีเรียบพอดีกับจุดข้อมูลแรก) xโดยการเพิ่มมิติของฟังก์ชั่นพื้นฐานของ ตัวอย่างเช่นการตั้งค่าkเท่ากับ8( k <- 8) และเรียกใช้รหัสข้างต้นใหม่ที่เราได้รับ

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

คุณไม่สามารถผลักดันkข้อมูลเหล่านี้ให้สูงขึ้นได้มากและคุณต้องระวังเรื่องการปรับตัวให้เหมาะสม ทั้งหมดpcls()กำลังทำคือการแก้ปัญหากำลังสองน้อยที่สุดที่ถูกลงโทษเนื่องจากข้อ จำกัด และฟังก์ชันพื้นฐานที่ให้มามันไม่ได้ทำการเลือกที่ราบรื่นสำหรับคุณ - ไม่ใช่ที่ฉันรู้ว่า ... )

หากคุณต้องการการแก้ไขจากนั้นดูฟังก์ชั่นฐาน R ?splinefunซึ่งมี Hermite splines และลูกบาศก์ splines ที่มีข้อ จำกัด แบบโมโนโทนิตี้ ในกรณีนี้คุณไม่สามารถใช้สิ่งนี้ได้เนื่องจากข้อมูลไม่ได้เป็นแบบโมโนโทนิคอย่างเคร่งครัด


ขอบคุณ ฉันแน่ใจว่าโซลูชันของคุณเหมาะสม แต่มีความซับซ้อนและสับสนจนฉันไม่สามารถใช้งานได้ splinefunเป็นความคิดเริ่มต้นของฉันเช่นกัน (ฉันกำลังสอดแทรก) แต่spline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")และspline(x=df$x, y=df$y, n=nrow(df), method="hyman")ทั้งคู่ก็ทำให้เกิดข้อผิดพลาด
เบ็น

1
ถ้าคุณลองฉันแน่ใจว่าคุณสามารถใช้ได้ ฉันมีความคิดเล็ก ๆ น้อย ๆ เกี่ยวกับสิ่งที่เกิดขึ้นภายใต้ประทุนที่นี่ แต่ฉันทำออกมาได้และฉันได้ระบุสถานที่ที่คุณต้องการเปลี่ยนสิ่งต่าง ๆ สมมติว่าคุณรู้ว่า R แน่นอนบาง รายละเอียดส่วนใหญ่เป็นการนำไปใช้งานซึ่งคุณสามารถเพิกเฉยได้หากสิ่งที่คุณต้องการจะทำให้พอดีกับเส้นโค้งที่จำกัดความน่าเบื่อ คุณต้องการให้ฉันใส่คำอธิบายเพิ่มเติมอีกเล็กน้อยเพื่อเน้นเพิ่มเติมเกี่ยวกับสิ่งที่ทำในแต่ละขั้นตอน การอ้างอิงใน?mono.conมีรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการ
Reinstate Monica - G. Simpson

สำหรับสาเหตุที่splinefunทำให้เกิดข้อผิดพลาด; ฉันเพิ่งรู้ว่าคุณสามารถใส่ได้พอดีกับเส้นโค้งเดียวที่ interpolates ข้อมูลที่ไม่ได้เป็นตัวเดียว การสังเกตที่x = 6ที่มากขึ้นว่าข้อสังเกตที่y x = 5คุณเพียงแค่ต้องเพิกเฉยส่วนหนึ่งของคำตอบ :-)
Reinstate Monica - G. Simpson

เข้าใจแล้ว และไม่จำเป็น - ฉันเป็นผู้ใช้ R ที่มีประสบการณ์ ฉันแค่ชอบที่จะเข้าใจคณิตศาสตร์เบื้องหลังสิ่งที่ฉันใช้และวิธีแก้ปัญหานี้ดูเหมือนจะมีอะไรเกิดขึ้นมากมายภายใต้ประทุน ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ
เบ็น

ฉันได้เพิ่มบันทึกย่อบางส่วนเพื่ออธิบายว่าแต่ละสิ่งเป็นหรือทำอะไร; ประเด็นหลักที่ควรทราบก็คือข้อ จำกัด ของความน่าเบื่อที่ถูกกำหนดโดยข้อ จำกัด ที่ไม่เท่ากันซึ่งmono.conส่งกลับเป็นลูกบาศก์อิสระ ?pclsมีตัวอย่างสำหรับแผ่นบางแผ่นบางและแบบเติมซึ่งใช้งานง่ายกว่าข้างต้น แต่อาจทำให้เห็นคณิตศาสตร์มากกว่านี้ถ้าคุณคุ้นเคยกับคณิตศาสตร์สำหรับเส้นโค้งประเภทนั้น (ฉันไม่คุ้นเคยกับตัวเอง)
Reinstate Monica - G. Simpson

13

แพคเกจการหลอกลวงล่าสุดโดย Natalya Pya และบนพื้นฐานของกระดาษ"รูปร่าง จำกัด แบบเติมแต่ง" โดย Pya & Wood (2015)สามารถทำให้ส่วนหนึ่งของกระบวนการที่กล่าวถึงในคำตอบที่ยอดเยี่ยมของกาวินง่ายกว่ามาก

library(scam)
con <- scam(y ~ s(x, k = k, bs = "mpd"), data = df)
plot(con)

มีฟังก์ชั่น bs จำนวนมากที่คุณสามารถใช้ - ในข้างต้นฉันใช้ mpd สำหรับ "monotonic ลด P-spline" แต่มันก็มีฟังก์ชั่นที่บังคับใช้นูนหรือเว้าแบบแยกจากกันหรือข้างตามข้อ จำกัด ของโมโนโทนิก

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