2014-11-04 24 views
9

Chức năng poly() của R tạo ra đa thức trực giao để lắp dữ liệu. Tuy nhiên, tôi muốn sử dụng các kết quả của hồi quy bên ngoài của R (nói trong C++), và dường như không có cách nào để có được các hệ số cho mỗi đa thức trực giao.Trích xuất các hệ số đa thức trực giao từ hàm poly() của R?

Lưu ý 1: Tôi không có nghĩa là hệ số hồi quy, nhưng các hệ số của đa thức trực giao), ví dụ: các p_i(x) trong

y = a0 + a1*p_1(x) + a2*p_2(x) + ... 

Note 2: Tôi biết poly(x, n, raw=T) lực lượng Poly trở đa thức không trực giao, nhưng tôi muốn thoái đối với đa thức trực giao, vì vậy đó là những gì tôi đang tìm kiếm.

+0

Bạn có thể thêm [ví dụ có thể tái sản xuất] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) bằng một số dữ liệu mẫu và hiển thị chính xác những gì bạn ' đang cố trích xuất? – MrFlick

Trả lời

14

Các đa thức được xác định đệ quy bằng cách sử dụng hệ số alphanorm2 của đối tượng poly mà bạn đã tạo. Hãy xem xét một ví dụ:

z <- poly(1:10, 3) 
attributes(z)$coefs 
# $alpha 
# [1] 5.5 5.5 5.5 
# $norm2 
# [1] 1.0 10.0 82.5 528.0 3088.8 

Đối với ký hiệu, chúng ta hãy gọi a_d phần tử trong chỉ số d của alpha và chúng ta hãy gọi n_d phần tử trong chỉ số d của norm2. F_d(x) sẽ là đa thức trực giao của độ d được tạo. Đối với một số trường hợp cơ sở chúng ta có:

F_0(x) = 1/sqrt(n_2) 
F_1(x) = (x-a_1)/sqrt(n_3) 

Phần còn lại của đa thức được đệ quy định nghĩa:

F_d(x) = [(x-a_d) * sqrt(n_{d+1}) * F_{d-1}(x) - n_{d+1}/sqrt(n_d) * F_{d-2}(x)]/sqrt(n_{d+2}) 

Để xác nhận với x=2.1:

x <- 2.1 
predict(z, newdata=x) 
#    1   2   3 
# [1,] -0.3743277 0.1440493 0.1890351 
# ... 

a <- attributes(z)$coefs$alpha 
n <- attributes(z)$coefs$norm2 
f0 <- 1/sqrt(n[2]) 
(f1 <- (x-a[1])/sqrt(n[3])) 
# [1] -0.3743277 
(f2 <- ((x-a[2]) * sqrt(n[3]) * f1 - n[3]/sqrt(n[2]) * f0)/sqrt(n[4])) 
# [1] 0.1440493 
(f3 <- ((x-a[3]) * sqrt(n[4]) * f2 - n[4]/sqrt(n[3]) * f1)/sqrt(n[5])) 
# [1] 0.1890351 

Cách nhỏ gọn nhất để xuất khẩu đa thức của bạn mã C++ của bạn có thể sẽ xuất khẩu attributes(z)$coefs$alphaattributes(z)$coefs$norm2 và sau đó sử dụng công thức đệ quy trong C++ để đánh giá đa thức của bạn.

+0

Tuyệt vời - đây chính xác là những gì tôi đang tìm kiếm. Trong tài liệu poly(), đề cập đến đã được thực hiện của biểu thức đệ quy 3 năm trong Kennedy & Gentle 1980, nhưng có học viện trái, tôi không còn có quyền truy cập miễn phí vào các ấn phẩm tạp chí, tôi nghĩ có lẽ nên là một cách dễ dàng làm điều này trong R. Cảm ơn. – Gilead

+3

@Gilead yeah Tôi cũng thấy tham chiếu đó, nhưng thành thật mà nói tôi thấy dễ đọc hơn [mã nguồn] (https://code.google.com/p/renjin/source/browse/packages/stats/src/ chính/R/contr.poly.R? spec = svndfc698cbde95783fac720091933b36557e78e86c & r = dfc698cbde95783fac720091933b36557e78e86c) (dòng 110-124) để tìm ra. – josliber

Các vấn đề liên quan