Hồi quy đa thức thô hay trực giao?


22

Tôi muốn hồi quy một biến lên . Tôi nên làm điều này bằng cách sử dụng đa thức thô hoặc trực giao? Tôi đã xem xét câu hỏi trên trang web liên quan đến những vấn đề này, nhưng tôi không thực sự hiểu sự khác biệt giữa việc sử dụng chúng. x , x 2 , ... , x 5yx,x2,,x5

Tại sao tôi không thể thực hiện hồi quy "bình thường" để lấy các hệ số của y = Σ 5 i = 0 β i x iβiy=i=05βixi (cùng với giá trị p và tất cả các công cụ hay khác) và thay vào đó phải lo lắng sử dụng đa thức thô hay trực giao? Sự lựa chọn này đối với tôi dường như nằm ngoài phạm vi của những gì tôi muốn làm.

Trong cuốn sách thống kê tôi hiện đang đọc (ISLR của Tibshirani et al) những điều này không được đề cập. Trên thực tế, họ đã bị hạ thấp một cách.
Lý do là, AFAIK, trong lm()hàm trong R, sử dụng y ~ poly(x, 2)số tiền để sử dụng đa thức trực giao và sử dụng y ~ x + I(x^2)số lượng để sử dụng số liệu thô. Nhưng trên trang 116, các tác giả nói rằng chúng tôi sử dụng tùy chọn đầu tiên bởi vì tùy chọn thứ hai là "cồng kềnh", điều này không cho thấy các lệnh này thực sự đối với những thứ hoàn toàn khác nhau (và có kết quả đầu ra khác nhau).
(câu hỏi thứ ba) Tại sao các tác giả của ISLR lại nhầm lẫn độc giả của họ như vậy?


1
@Sycorax Tôi biết rằng polycó liên quan đến đa thức trực giao và tôi (x ^ 2) không (mặc dù tôi không biết chi tiết) - nhưng, tại sao các tác giả của ISLR sau đó lại đề xuất một phương pháp không hiệu quả ? Có vẻ rất sai lệch nếu cả hai lệnh dường như làm như vậy, nhưng chỉ có một lệnh thực sự là ok.
l7ll7

1
@gung Tôi đã xem tài liệu polyvà đã dành một thời gian cho vấn đề này, nhưng tôi không thể hiểu tại sao poly (x, 2) và x + I (x ^ 2) lại tạo ra sự khác biệt? Bạn có thể vui lòng khai sáng cho tôi ở đây trong các ý kiến, nếu câu hỏi là không chính thức?
l7ll7

1
@gung Tôi đã hoàn thành chỉnh sửa lại câu hỏi của mình. Sự lựa chọn thô / trực giao này thậm chí còn làm tôi bối rối hơn - trước đây tôi nghĩ rằng đây chỉ là một Rkỹ thuật nhỏ , mà tôi không hiểu, nhưng bây giờ nó có vẻ là một vấn đề thống kê đầy đủ gây trở ngại cho tôi khi thực hiện mã hóa hồi quy không nên khó mã hóa
l7ll7

2
@gung Điều đó thực sự làm tôi bối rối hơn nó giúp. Trước đây tôi nghĩ rằng tôi chỉ nên đi với đa thức trực giao, bởi vì đó có vẻ là cách đúng, nhưng trong câu trả lời đó đa thức thô được sử dụng. Đáng ngạc nhiên, tất cả mọi người trên mạng đang hét lên "RTFM", nhưng thực sự không có câu trả lời rõ ràng, khi nào nên sử dụng những gì. (Liên kết của bạn cũng không đưa ra câu trả lời cho điều này, chỉ là một ví dụ, khi chỉnh sửa sai.)
l7ll7

2
Trừ khi bạn đang làm việc trong một số lĩnh vực vật lý hoặc kỹ thuật nói rằng phản hồi sẽ là một đa thức tinh túy, gần như chắc chắn cách tiếp cận đúng là không thực hiện hồi quy đa thức ngay từ đầu. Đầu tư độ của bạn tự do trong một spline hoặc cái gì đó sẽ xa linh hoạt hơn và ổn định hơn phù hợp với đa thức.
whuber

Câu trả lời:


10

Tôi tin rằng câu trả lời ít hơn về sự ổn định số (mặc dù điều đó đóng vai trò) và nhiều hơn về việc giảm tương quan.

Về bản chất - vấn đề tập trung vào thực tế là khi chúng ta hồi quy chống lại một loạt các đa thức bậc cao, các đồng biến chúng ta đang hồi quy chống lại trở nên tương quan cao. Mã ví dụ dưới đây:

x = rnorm(1000)
raw.poly = poly(x,6,raw=T)
orthogonal.poly = poly(x,6)
cor(raw.poly)
cor(orthogonal.poly)

Điều này là vô cùng quan trọng. Khi các đồng biến trở nên tương quan hơn, khả năng của chúng tôi để xác định cái nào là quan trọng (và kích thước của hiệu ứng của chúng) sẽ bị xói mòn nhanh chóng. Điều này thường được gọi là vấn đề của đa cộng đồng. Ở giới hạn, nếu chúng ta có hai biến tương quan hoàn toàn, khi chúng ta hồi quy chúng với thứ gì đó, không thể phân biệt giữa hai biến - bạn có thể coi đây là một phiên bản cực đoan của vấn đề, nhưng vấn đề này ảnh hưởng đến ước tính của chúng tôi mức độ tương quan ít hơn là tốt. Do đó, theo một nghĩa thực tế - ngay cả khi sự không ổn định về số lượng không phải là vấn đề - mối tương quan từ các đa thức bậc cao gây thiệt hại to lớn cho thói quen suy luận của chúng ta. Điều này sẽ biểu hiện dưới dạng các lỗi tiêu chuẩn lớn hơn (và do đó các chỉ số t nhỏ hơn) mà bạn thường thấy (xem ví dụ hồi quy bên dưới).

y = x*2 + 5*x**3 - 3*x**2 + rnorm(1000)
raw.mod = lm(y~poly(x,6,raw=T))
orthogonal.mod = lm(y~poly(x,6))
summary(raw.mod)
summary(orthogonal.mod)

Nếu bạn chạy mã này, việc giải thích là một khó khăn vì tất cả các hệ số đều thay đổi và do đó mọi thứ rất khó để so sánh. Nhìn vào các số liệu thống kê T, chúng ta có thể thấy rằng khả năng xác định các hệ số lớn hơn nhiều với các đa thức trực giao. Đối với 3 hệ số có liên quan, tôi có các chỉ số t (560,21,449) cho mô hình trực giao và chỉ (28, -38.121) cho mô hình đa thức thô. Đây là một sự khác biệt rất lớn đối với một mô hình đơn giản chỉ với một vài thuật ngữ đa thức bậc thấp tương đối quan trọng.

Điều đó không có nghĩa là điều này đến mà không có chi phí. Có hai chi phí chính phải ghi nhớ. 1) chúng ta mất một số khả năng giải thích với đa thức trực giao. Chúng ta có thể hiểu hệ số trên x**3có nghĩa là gì, nhưng việc giải thích hệ số trên x**3-3x(poly ẩn thứ ba - không nhất thiết là những gì bạn sẽ sử dụng) có thể khó hơn nhiều. Thứ hai - khi chúng ta nói rằng đây là các đa thức là trực giao - chúng tôi muốn nói rằng chúng là trực giao đối với một số đo khoảng cách. Chọn một thước đo khoảng cách có liên quan đến tình huống của bạn có thể khó khăn. Tuy nhiên, đã nói rằng, tôi tin rằng polyhàm được thiết kế để chọn sao cho nó trực giao với hiệp phương sai - rất hữu ích cho hồi quy tuyến tính.


3
-1. Các lỗi tiêu chuẩn lớn hơn mà bạn thấy trên các hệ số bậc thấp hơn là cá trích đỏ. Các hệ số bậc thấp hơn trong hai mô hình của bạn đang ước tính những thứ hoàn toàn khác nhau, vì vậy việc so sánh các lỗi tiêu chuẩn của chúng không có ý nghĩa gì. Hệ số bậc cao nhất là hệ số duy nhất ước tính cùng một thứ trong cả hai mô hình và bạn sẽ thấy rằng thống kê t giống hệt nhau cho dù đa thức có trực giao hay không. Hai mô hình của bạn tương đương về mặt thống kê về các giá trị được trang bị, R ^ 2, v.v., chúng khác nhau chủ yếu chỉ là về cách giải thích các hệ số
Jake Westfall

@JakeWestfall, tôi không nghĩ tôi đồng ý với bạn. Trước hết, việc chạy mã tạo ra các giá trị khác nhau cho tất cả các đơn đặt hàng đa thức, không phải tất cả, ngoại trừ một - về bản chất, nó lấy đa thức và thực hiện PCA trên đó. Thứ hai, và quan trọng hơn, các số liệu thống kê t rất khác nhau - chạy mã trong câu trả lời của tôi sẽ xác nhận rằng - về mặt chức năng, chúng tôi đang giải quyết vấn đề đa cộng đồng. Bạn đúng rằng các giá trị được trang bị, R ^ 2, F-tests, v.v. không thay đổi. Thực tế đó là một lý do để trực giao - nó không thay đổi gì ngoại trừ khả năng phát hiện các thuật ngữ đa thức của chúng tôi .
dùng5957401

1
Re: điểm đầu tiên, xin lỗi, tôi muốn nói đến t-stat của thuật ngữ bậc cao nhất, không phải hệ số của nó. Công cụ dự đoán đó được chia tỷ lệ + thay đổi giữa các mô hình, do đó, có thay đổi coef, nhưng nó kiểm tra hiệu ứng thực chất tương tự, như được hiển thị bởi t
Jake Westfall

Re: điểm thứ hai, lý do "các chỉ số t khác nhau đáng kể" đối với các điều khoản bậc thấp là, một lần nữa, bởi vì chúng đang ước tính những điều hoàn toàn khác nhau trong hai mô hình. Xem xét hiệu ứng tuyến tính: trong raw.modđó ước tính độ dốc của đường cong tại x = 0, trong orthogonal.modđó ước tính độ dốc biên (nghĩa là giống hệt với lm(y ~ poly(x,1))các thuật ngữ bậc cao hơn được bỏ qua). Không có lý do gì mà các ước tính của các ước tính hoàn toàn khác nhau này phải có các lỗi tiêu chuẩn tương đương. Người ta có thể dễ dàng xây dựng một ví dụ phản tác dụng raw.modcó chỉ số t cao hơn nhiều
Jake Westfall

@JakeWestfall. Tôi vẫn nghĩ rằng bạn đang thiếu tính đa hình. Tuy nhiên, chúng tôi dường như đang nói chuyện với nhau, và có lẽ có một giải pháp. Bạn nói rằng bạn có thể dễ dàng xây dựng một ví dụ ngược lại, xin vui lòng làm. Tôi nghĩ rằng nhìn thấy dgp bạn có trong tâm trí sẽ làm rõ rất nhiều cho tôi. Hiện tại, những điều duy nhất tôi có thể nghĩ ra có thể hành xử như bạn mô tả liên quan đến lỗi chính tả mô hình nghiêm trọng.
dùng5957401

8

Tại sao tôi không thể thực hiện hồi quy "bình thường" để có được các hệ số?

Bởi vì nó không ổn định về số lượng. Hãy nhớ rằng máy tính đang sử dụng số bit cố định để thể hiện số float. Kiểm tra IEEE754 để biết chi tiết, bạn có thể ngạc nhiên rằng ngay cả số đơn giản , máy tính cũng cần lưu trữ nó là . Bạn có thể thử các số khác ở đây0,40000000596046447753906250,40.4000000059604644775390625

Sử dụng đa thức thô sẽ gây ra vấn đề vì chúng ta sẽ có số lượng rất lớn. Đây là một bằng chứng nhỏ: chúng ta đang so sánh số điều kiện ma trận với đa thức thô và trực giao.

> kappa(model.matrix(mpg~poly(wt,10),mtcars))
[1] 5.575962
> kappa(model.matrix(mpg~poly(wt,10, raw = T),mtcars))
[1] 2.119183e+13

Bạn cũng có thể kiểm tra câu trả lời của tôi ở đây cho một ví dụ.

Tại sao có hệ số lớn cho đa thức bậc cao


6
Bạn dường như đang sử dụng các phao chính xác duy nhất và trích dẫn chúng để tăng gấp bốn lần độ chính xác! Làm thế nào điều đó xảy ra? Ngoại trừ GPU, hầu như tất cả các tính toán thống kê đều sử dụng độ chính xác ít nhất gấp đôi. Ví dụ, trong Rđầu ra print(0.4, digits=20)0.40000000000000002.
whuber

6

Tôi cảm thấy như một vài trong số những câu trả lời này hoàn toàn bỏ lỡ vấn đề. Câu trả lời của Haitao giải quyết các vấn đề tính toán với việc điều chỉnh đa thức thô, nhưng rõ ràng OP đang hỏi về sự khác biệt thống kê giữa hai phương pháp. Đó là, nếu chúng ta có một máy tính hoàn hảo có thể đại diện chính xác cho tất cả các giá trị, tại sao chúng ta lại thích một cách tiếp cận hơn các phương pháp khác?

R2XYX= =0X= =0X

data("iris")

#Raw:
fit.raw <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
summary(fit.raw)

#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)        1.1034     0.1304   8.464 2.50e-14 ***
#> Petal.Width        1.1527     0.5836   1.975  0.05013 .  
#> I(Petal.Width^2)   1.7100     0.5487   3.116  0.00221 ** 
#> I(Petal.Width^3)  -0.5788     0.1408  -4.110 6.57e-05 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.3898 on 146 degrees of freedom
#> Multiple R-squared:  0.9522, Adjusted R-squared:  0.9512 
#> F-statistic: 969.9 on 3 and 146 DF,  p-value: < 2.2e-16

#Orthogonal
fit.orth <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), data = iris)

#Marginal effect of X at X=0 from orthogonal model
library(margins)
summary(margins(fit.orth, variables = "Petal.Width", 
                at = data.frame(Petal.Width = 0)))
#> Warning in check_values(data, at): A 'at' value for 'Petal.Width' is
#> outside observed data range (0.1,2.5)!
#>       factor Petal.Width    AME     SE      z      p  lower  upper
#>  Petal.Width      0.0000 1.1527 0.5836 1.9752 0.0482 0.0089 2.2965

Được tạo vào ngày 2019-10-25 bởi gói reprex (v0.3.0)

Hiệu ứng cận biên của Petal.Width0 từ sự phù hợp trực giao và sai số chuẩn của nó hoàn toàn bằng với hiệu ứng từ đa thức thô. Sử dụng đa thức trực giao không cải thiện độ chính xác của các ước tính có cùng số lượng giữa hai mô hình.

YX? "bạn có thể phù hợp với hồi quy đa thức trực giao và tương quan bán nguyệt bình phương trên số hạng tuyến tính sẽ đại diện cho đại lượng này. Điều này không đúng với đa thức thô. thuật ngữ tuyến tính không biểu thị tỷ lệ phương sai trong giải thích bởi thành phần tuyến tính của Xem bên dưới.YX

library(jtools)
data("iris")

fit.raw3 <- lm(Petal.Length ~ Petal.Width + I(Petal.Width^2) +
                  I(Petal.Width^3), data = iris)
fit.raw1 <- lm(Petal.Length ~ Petal.Width, data = iris)

round(summ(fit.raw3, part.corr = T)$coef, 3)
#>                    Est.  S.E. t val.     p partial.r part.r
#> (Intercept)       1.103 0.130  8.464 0.000        NA     NA
#> Petal.Width       1.153 0.584  1.975 0.050     0.161  0.036
#> I(Petal.Width^2)  1.710 0.549  3.116 0.002     0.250  0.056
#> I(Petal.Width^3) -0.579 0.141 -4.110 0.000    -0.322 -0.074

round(summ(fit.raw1, part.corr = T)$coef, 3)
#>              Est.  S.E. t val. p partial.r part.r
#> (Intercept) 1.084 0.073 14.850 0        NA     NA
#> Petal.Width 2.230 0.051 43.387 0     0.963  0.963

fit.orth3 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3), 
               data = iris)
fit.orth1 <- lm(Petal.Length ~ stats::poly(Petal.Width, 3)[,1], 
               data = iris)

round(summ(fit.orth3, part.corr = T)$coef, 3)
#>                                Est.  S.E.  t val. p partial.r part.r
#> (Intercept)                   3.758 0.032 118.071 0        NA     NA
#> stats::poly(Petal.Width, 3)1 20.748 0.390  53.225 0     0.975  0.963
#> stats::poly(Petal.Width, 3)2 -3.015 0.390  -7.735 0    -0.539 -0.140
#> stats::poly(Petal.Width, 3)3 -1.602 0.390  -4.110 0    -0.322 -0.074

round(summ(fit.orth1, part.corr = T)$coef, 3)
#>                                    Est.  S.E. t val. p partial.r part.r
#> (Intercept)                       3.758 0.039 96.247 0        NA     NA
#> stats::poly(Petal.Width, 3)[, 1] 20.748 0.478 43.387 0     0.963  0.963

Được tạo vào ngày 2019-10-25 bởi gói reprex (v0.3.0)

0,0010,0030,0050,9270,9270,0200,0050,927. Từ mô hình đa thức trực giao nhưng không phải là mô hình đa thức thô, chúng ta biết rằng hầu hết các phương sai được giải thích trong kết quả là do thuật ngữ tuyến tính, rất ít đến từ thuật ngữ bình phương và thậm chí ít hơn từ thuật ngữ khối. Các giá trị đa thức thô không kể câu chuyện đó.

Bây giờ, cho dù bạn muốn lợi ích diễn giải này so với lợi ích liên ngành của việc thực sự có thể hiểu các hệ số của mô hình, thì bạn nên sử dụng đa thức trực giao. Nếu bạn muốn xem xét các hệ số và biết chính xác ý nghĩa của chúng (mặc dù tôi nghi ngờ người ta thường làm như vậy), thì bạn nên sử dụng các đa thức thô. Nếu bạn không quan tâm (nghĩa là bạn chỉ muốn kiểm soát để gây nhiễu hoặc tạo ra các giá trị dự đoán), thì điều đó thực sự không thành vấn đề; cả hai hình thức đều mang cùng một thông tin liên quan đến các mục tiêu đó. Tôi cũng sẽ lập luận rằng các đa thức trực giao nên được ưu tiên trong chính quy hóa (ví dụ: lasso), bởi vì việc loại bỏ các thuật ngữ bậc cao không ảnh hưởng đến các hệ số của các điều khoản bậc thấp, không đúng với đa thức thô,


1
Đóng góp xuất sắc. Tôi không thể sao chép kết quả cận biên của bạn (hàm lề xuất hiện lỗi về poly khi tôi cố chạy khối mã đầu tiên của bạn - tôi không quen với gói lề) - nhưng chúng chính xác là những gì tôi mong đợi. Như một gợi ý nhỏ - bạn cũng nên bao gồm đầu ra của phân tích lề trên mô hình thô. Đối số của bạn không bị ảnh hưởng (một chút) bởi sự thay đổi giá trị p từ tóm tắt sang các hàm lề (thay đổi kết luận của chúng tôi không kém!) - điều này dường như được gây ra bằng cách sử dụng thông thường thay vì phân phối. Điểm chính quy của bạn là tuyệt vời.
dùng5957401

1
Cảm ơn bạn cho các từ loại. Tôi nghĩ rằng bạn phải bao gồm stats::trong các cuộc gọi đến poly()trong lm()cho marginsđể nhận ra nó (đó là ngu ngốc). Tôi muốn tập trung vào lập luận của mình về các ước tính điểm và các lỗi tiêu chuẩn và tôi biết có rất nhiều thông tin không liên quan và gây mất tập trung được trình bày, nhưng tôi hy vọng văn bản minh họa các điểm của tôi.

Không phải vậy đâu. Tôi đã sao chép mã của bạn chính xác, và bạn sử dụng stats::poly(). Lỗi nói 'degree' must be less than number of unique points- không giúp tôi nhiều. Tuy nhiên, việc margin()sao lưu các báo cáo có thể chứng minh được nên không quan trọng.
dùng5957401

4

Tôi chứng thực phản hồi tuyệt vời từ @ user5957401 và thêm nhận xét về nội suy, ngoại suy và báo cáo.

Ngay cả trong miền của các giá trị tham số ổn định, các hệ số / tham số được mô hình bởi các đa thức trực giao sẽ có các lỗi tiêu chuẩn nhỏ hơn đáng kể so với các hệ số / tham số được mô hình hóa bởi các tham số thô. Về cơ bản, các đa thức trực giao là một tập hợp các mô tả không hiệp phương sai miễn phí. Đó là PCA miễn phí!

Hạn chế tiềm năng duy nhất là phải giải thích điều này với người không hiểu được đức tính của mô tả hiệp phương sai. Các hệ số không thể giải thích được ngay lập tức trong bối cảnh các hiệu ứng bậc nhất (giống như vận tốc) hoặc bậc hai (giống như gia tốc). Điều này có thể khá tai hại trong một thiết lập kinh doanh.

10-d~R2mộtdj R2

Vì vậy, tôi sẽ là "đơn đặt hàng độ lớn" tự tin hơn khi báo cáo mô hình trực giao so với mô hình thô. Trong thực tế, tôi sẽ nội suy với một trong hai mô hình, nhưng tôi sẽ ngoại suy chỉ với mô hình trực giao.


1

Tôi sẽ chỉ bình luận để đề cập đến điều này, nhưng tôi không có đủ đại diện, vì vậy tôi sẽ cố gắng mở rộng thành một câu trả lời. Bạn có thể thấy thú vị khi thấy trong Phần Lab 7.8.1 trong "Giới thiệu về học thống kê" (James và cộng sự, 2017, đã in lần thứ 8), họ thảo luận về một số khác biệt giữa việc sử dụng đa thức trực giao hay không, có sử dụng raw=TRUEhoặc raw=FALSEtrong poly()chức năng. Ví dụ: các ước tính hệ số sẽ thay đổi, nhưng các giá trị được trang bị thì không:

# using the Wage dataset in the ISLR library
fit1 <- lm(wage ~ poly(age, 4, raw=FALSE), data=Wage)
fit2 <- lm(wage ~ poly(age, 4, raw=TRUE), data=Wage)
print(coef(fit1)) # coefficient estimates differ
print(coef(fit2))
all.equal(predict(fit1), predict(fit2)) #returns TRUE    

Cuốn sách cũng thảo luận về cách sử dụng đa thức trực giao, các giá trị p thu được khi sử dụng anova()phép thử F lồng nhau (để khám phá mức độ đa thức có thể được bảo hành) giống như các giá trị thu được khi sử dụng phép thử t tiêu chuẩn, đầu ra summary(fit). Điều này minh họa rằng thống kê F bằng với bình phương của thống kê t trong các tình huống nhất định.


Bình luận không bao giờ nên được sử dụng như câu trả lời bất kể số danh tiếng của bạn.
Michael R. Chernick

Về điểm cuối cùng của bạn, điều này cũng đúng với đa thức không trực giao. Phép thử t hệ số bằng với phép thử F so sánh một mô hình với hệ số trong nó và một mô hình không có tất cả các hệ số trong hồi quy (được thực hiện cùng một lúc).
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.