Làm thế nào để làm mịn dữ liệu và lực đơn điệu


14

Tôi có một số dữ liệu mà tôi muốn làm mịn để các điểm được làm mịn giảm đi một cách đơn điệu. Dữ liệu của tôi giảm mạnh và sau đó bắt đầu lên cao nguyên. Đây là một ví dụ sử dụng 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()

âm mưu dữ liệu để trơn tru

Một kỹ thuật làm mịn tốt tôi có thể sử dụng là gì? Ngoài ra, thật tuyệt nếu tôi có thể buộc điểm được làm mịn thứ 1 gần với điểm quan sát của mình.


1
Tôi nhận thấy giá trị ví dụ của bạn là số nguyên. Là giá trị thực của bạn được tính? Nếu chúng là như vậy thì (trong khi điều này không đảm bảo tính đơn điệu, đối với dữ liệu như thế này, nó thường sẽ cung cấp cho nó), một cái gì đó như thế này có thể hữu ích:plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Glen_b -Reinstate Monica

Tương tự Q với câu trả lời: stats.stackexchange.com/questions/206073/ Kẻ
kjetil b halvorsen

Câu trả lời:


17

Bạn có thể làm điều này bằng cách sử dụng các spline bị phạt với các ràng buộc đơn điệu thông qua các hàm mono.con()pcls()hàm trong gói mgcv . Có một chút khó khăn phải làm vì các chức năng này không thân thiện với người dùng gam(), nhưng các bước được hiển thị bên dưới, chủ yếu dựa trên ví dụ từ ?pcls, được sửa đổi cho phù hợp với dữ liệu mẫu bạn đã cung cấp:

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!

Bây giờ chúng ta cần điền vào đối tượng được chuyển qua để pcls()chứa các chi tiết của mô hình bị ràng buộc bị phạt mà chúng ta muốn phù hợp

## 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

Bây giờ chúng ta cuối cùng cũng có thể làm được việc lắp

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

pchứa một vectơ hệ số cho các hàm cơ sở tương ứng với spline. Để hình dung spline được trang bị, chúng ta có thể dự đoán từ mô hình tại 100 vị trí trong phạm vi x. Chúng tôi thực hiện 100 giá trị để có được một dòng mượt mà trên cốt truyện.

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

Để tạo các giá trị dự đoán mà chúng tôi sử dụng Predict.matrix(), nó tạo ra một ma trận sao cho khi nhiều hệ số pmang lại các giá trị dự đoán từ mô hình được trang bị:

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

Điều này tạo ra:

nhập mô tả hình ảnh ở đây

Tôi sẽ để nó cho bạn lấy dữ liệu ở dạng gọn gàng để vẽ đồ thị với ggplot ...

Bạn có thể buộc phù hợp chặt chẽ hơn (để trả lời một phần câu hỏi của bạn về việc có điểm phù hợp mượt mà hơn với điểm dữ liệu đầu tiên) bằng cách tăng kích thước của hàm cơ sở của x. Ví dụ: đặt kbằng 8( k <- 8) và chạy lại mã ở trên mà chúng tôi nhận được

nhập mô tả hình ảnh ở đây

Bạn không thể đẩy kcao hơn nhiều cho những dữ liệu này và bạn phải cẩn thận về việc phù hợp quá mức; tất cả pcls()đang làm là giải quyết vấn đề bình phương tối thiểu bị phạt do các ràng buộc và các hàm cơ sở được cung cấp, nó không thực hiện lựa chọn độ trơn cho bạn - không phải tôi biết ...)

Nếu bạn muốn nội suy, thì hãy xem hàm R cơ sở có các hàm ?splinefunHermite và các khối vuông với các ràng buộc đơn điệu. Trong trường hợp này, bạn không thể sử dụng điều này tuy nhiên dữ liệu không hoàn toàn đơn điệu.


Cảm ơn. Tôi chắc rằng giải pháp của bạn là một giải pháp phù hợp, nhưng nó phức tạp và khó hiểu đến mức tôi không thể sử dụng nó. splinefuncũng là suy nghĩ ban đầu của tôi (tôi đang nội suy) nhưng 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")cả hai đều phát sinh lỗi
Ben

Nếu bạn chỉ thử, tôi chắc chắn bạn có thể sử dụng nó; Tôi có ít ý tưởng về những gì đang diễn ra dưới mui xe ở đây nhưng tôi đã giải quyết nó và tôi đã chỉ ra những nơi bạn cần thay đổi mọi thứ. Giả sử bạn biết một số R tất nhiên . Hầu hết các chi tiết là triển khai mà bạn có thể bỏ qua nếu tất cả những gì bạn muốn làm nó phù hợp với một spline bị ràng buộc đơn điệu. Bạn có muốn tôi chú thích mã thêm một chút để làm nổi bật hơn về những gì mỗi bước đang làm không? Các tài liệu tham khảo trong ?mono.concó thêm chi tiết về phương pháp.
Phục hồi Monica - G. Simpson

Đối với lý do tại sao splinefunđang gây ra một lỗi; Tôi mới nhận ra, bạn có thể lắp một spline đơn điệu để nội suy dữ liệu không phải là đơn điệu. Các quan sát tại x = 6là lớn hơn ymà các quan sát tại x = 5. Bạn sẽ chỉ cần bỏ qua phần đó của câu trả lời :-)
Tái lập lại Monica - G. Simpson

Hiểu rồi. Và không cần - Tôi là một người dùng R có kinh nghiệm. Tôi chỉ muốn hiểu toán học đằng sau những gì tôi sử dụng và giải pháp này dường như có khá nhiều điều đang diễn ra dưới mui xe. Cảm ơn một lần nữa vì sự giúp đỡ của bạn.
Ben

Tôi đã thêm một số lưu ý để giải thích mỗi việc là gì hoặc làm gì; điểm chính cần lưu ý là các ràng buộc đơn điệu đang được áp đặt bởi một tập các ràng buộc bất đẳng thức cụ thể mono.contrả về một spline hình khối. ?pclscó các ví dụ cho các spline tấm mỏng và các mô hình phụ gia ít thân thiện với người dùng hơn ở trên, nhưng có thể làm lộ thêm một số phép toán nếu bạn quen thuộc với toán học cho các loại spline đó (bản thân tôi không quen thuộc lắm).
Phục hồi Monica - G. Simpson

13

Gói lừa đảo gần đây của Natalya Pya và dựa trên bài báo "Các mô hình phụ gia bị ràng buộc hình dạng" của Pya & Wood (2015) có thể làm cho một phần của quy trình được đề cập trong câu trả lời xuất sắc của Gavin dễ dàng hơn nhiều.

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

Có một số hàm bs bạn có thể sử dụng - ở trên tôi đã sử dụng mpd cho "P-spline giảm đơn điệu" nhưng nó cũng có các hàm thực thi lồi hoặc lõm hoặc riêng rẽ hoặc bên cạnh các ràng buộc đơn điệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.