Nối mô hình đa thức với dữ liệu trong R


83

Tôi đã đọc câu trả lời cho câu hỏi này và chúng khá hữu ích, nhưng tôi cần trợ giúp đặc biệt trong R.

Tôi có một tập dữ liệu mẫu trong R như sau:

x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)

Tôi muốn phù hợp với một mô hình cho những dữ liệu này y = f(x). Tôi muốn nó là một mô hình đa thức bậc 3.

Làm thế nào tôi có thể làm điều đó trong R?

Ngoài ra, R có thể giúp tôi tìm mẫu phù hợp nhất không?

Câu trả lời:


98

Để nhận được một đa thức bậc ba trong x (x ^ 3), bạn có thể làm

lm(y ~ x + I(x^2) + I(x^3))

hoặc là

lm(y ~ poly(x, 3, raw=TRUE))

Bạn có thể vừa với một đa thức bậc 10 và có được một đa thức gần như hoàn hảo, nhưng bạn có nên không?

EDIT: poly (x, 3) có lẽ là lựa chọn tốt hơn (xem @hadley bên dưới).


6
được chú ý trong câu hỏi "nên bạn". Dữ liệu mẫu chỉ có 8 điểm. Mức độ tự do ở đây khá thấp. Tất nhiên, dữ liệu cuộc sống thực có thể có nhiều hơn thế.
JD Dài

1
Cảm ơn câu trả lời của bạn. Điều gì về việc để R để tìm ra mô hình phù hợp nhất? Có bất kỳ chức năng nào cho việc này?
Mehper C. Palavuzlar

5
Nó phụ thuộc vào định nghĩa của bạn về "mô hình tốt nhất". Mô hình cung cấp cho bạn R ^ 2 lớn nhất (mà một đa thức bậc 10 sẽ có) không nhất thiết là mô hình "tốt nhất". Các thuật ngữ trong mô hình của bạn cần được lựa chọn hợp lý. Bạn có thể có được một sự phù hợp gần như hoàn hảo với rất nhiều thông số nhưng mô hình sẽ không có khả năng dự đoán và sẽ vô dụng cho bất kỳ điều gì khác ngoài việc vẽ một đường vừa vặn nhất qua các điểm.
Greg

10
Tại sao bạn đang sử dụng raw = T? Tốt hơn là sử dụng các biến không liên quan.
hadley

2
Tôi đã làm điều đó để có được kết quả tương tự như lm(y ~ x + I(x^2) + I(x^3)). Có lẽ không tối ưu, chỉ đưa ra hai phương tiện cho cùng một mục đích.
Greg

45

Mô hình nào là "mô hình phù hợp nhất" tùy thuộc vào ý bạn muốn nói "tốt nhất". R có các công cụ để trợ giúp, nhưng bạn cần cung cấp định nghĩa cho "tốt nhất" để lựa chọn giữa chúng. Hãy xem xét dữ liệu và mã ví dụ sau:

x <- 1:10
y <- x + c(-0.5,0.5)

plot(x,y, xlim=c(0,11), ylim=c(-1,12))

fit1 <- lm( y~offset(x) -1 )
fit2 <- lm( y~x )
fit3 <- lm( y~poly(x,3) )
fit4 <- lm( y~poly(x,9) )
library(splines)
fit5 <- lm( y~ns(x, 3) )
fit6 <- lm( y~ns(x, 9) )

fit7 <- lm( y ~ x + cos(x*pi) )

xx <- seq(0,11, length.out=250)
lines(xx, predict(fit1, data.frame(x=xx)), col='blue')
lines(xx, predict(fit2, data.frame(x=xx)), col='green')
lines(xx, predict(fit3, data.frame(x=xx)), col='red')
lines(xx, predict(fit4, data.frame(x=xx)), col='purple')
lines(xx, predict(fit5, data.frame(x=xx)), col='orange')
lines(xx, predict(fit6, data.frame(x=xx)), col='grey')
lines(xx, predict(fit7, data.frame(x=xx)), col='black')

Mô hình nào trong số đó là tốt nhất? đối số có thể được thực hiện cho bất kỳ đối số nào trong số chúng (nhưng tôi đối với một đối số sẽ không muốn sử dụng đối số màu tím để nội suy).


15

Về câu hỏi 'R có thể giúp tôi tìm mô hình phù hợp nhất không', có thể có một chức năng để làm điều này, giả sử bạn có thể nêu tập hợp các mô hình để kiểm tra, nhưng đây sẽ là cách tiếp cận đầu tiên tốt cho tập hợp n-1 đa thức bậc:

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

Ghi chú

  • Hiệu lực của cách tiếp cận này sẽ phụ thuộc vào mục tiêu của bạn, các giả định optimize()AIC()và nếu AIC là tiêu chí mà bạn muốn sử dụng,

  • polyfit()có thể không có một mức tối thiểu. kiểm tra điều này với một cái gì đó như:

    for (i in 2:length(x)-1) print(polyfit(i))
    
  • Tôi đã sử dụng as.integer()hàm vì không rõ tôi sẽ diễn giải một đa thức không phải là số nguyên như thế nào.

  • để kiểm tra một bộ phương trình toán học tùy ý, hãy xem xét chương trình 'Eureqa' được Andrew Gelman đánh giá tại đây

Cập nhật

Cũng xem stepAICchức năng (trong gói MASS) để tự động hóa việc lựa chọn kiểu máy.


Làm cách nào để giao tiếp Eurequa với R?
adam.888

@ adam.888 câu hỏi hay - Tôi không biết câu trả lời nhưng bạn có thể đăng riêng. Điểm cuối cùng đó là một chút lạc đề.
David LeBauer 10/09/13

Lưu ý: AIC là Tiêu chí Thông tin Akaike , thưởng cho sự phù hợp và phạt một số lượng lớn hơn các thông số của một mô hình, theo cách đã được chứng minh là tối ưu theo nhiều nghĩa khác nhau. vi.wikipedia.org/wiki/Akaike_information_criterion
Evgeni Sergeev

5

Cách dễ nhất để tìm sự phù hợp nhất trong R là viết mã mô hình là:

lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)

Sau khi sử dụng hồi quy AIC bước xuống

lm.s <- step(lm.1)

5
Sử dụng I(x^2), v.v. không cung cấp các đa thức trực giao thích hợp để phù hợp.
Brian Diggs
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.