Làm thế nào để giải thích các hệ số từ một mô hình đa thức phù hợp?


36

Tôi đang cố gắng tạo một đa thức bậc hai phù hợp với một số dữ liệu tôi có. Hãy nói rằng tôi vẽ điều này phù hợp với ggplot():

ggplot(data, aes(foo, bar)) + geom_point() + 
       geom_smooth(method="lm", formula=y~poly(x, 2))

Tôi có:

âm mưu phù hợp với parabol với dải tin cậy trên scatterplot

Vì vậy, một trật tự thứ hai hoạt động khá tốt. Tôi tính toán nó với R:

summary(lm(data$bar ~ poly(data$foo, 2)))

Va tôi lây:

lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
#                     Estimate Std. Error t value Pr(>|t|)    
# (Intercept)         3.268162   0.008282 394.623   <2e-16 ***
# poly(data$foo, 2)1 -0.122391   0.096225  -1.272    0.206
# poly(data$foo, 2)2  1.575391   0.096225  16.372   <2e-16 ***
# ....

Bây giờ, tôi sẽ giả sử công thức cho sự phù hợp của tôi là:

quán ba= =3.268-0,125foo+1.575foo2

Nhưng điều đó chỉ mang lại cho tôi những giá trị sai lầm. Ví dụ: với là 3, tôi sẽ mong đợi sẽ trở thành thứ gì đó vào khoảng 3.15. Tuy nhiên, chèn vào công thức trên tôi nhận được: thanh foofooquán ba

quán ba= =3.268-0,1253+1.57532= =17.077

Đưa cái gì? Tôi có diễn giải không chính xác các hệ số của mô hình không?


2
Câu hỏi này được trả lời trong một số chủ đề có thể được tìm thấy bằng cách tìm kiếm trang web của chúng tôi cho đa thức trực giao
whuber

6
@whuber Nếu tôi biết rằng vấn đề là do "đa thức trực giao", có lẽ tôi đã tìm thấy câu trả lời. Nhưng nếu bạn không biết tìm kiếm cái gì, thì hơi khó.
dùng13907

2
Bạn cũng có thể tìm thấy câu trả lời bằng cách tìm kiếm trên poly , xuất hiện nổi bật trong mã của bạn. Tôi đưa thông tin đó vào các bình luận vì hai lý do: (1) các liên kết có thể giúp người đọc tương lai cũng như chính bạn và (2) họ có thể giúp chỉ cho bạn cách khai thác hệ thống tìm kiếm (hơi bình dị) của chúng tôi.
whuber

7
Bạn đã đăng một câu hỏi liên quan đến việc bạn sử dụng polymà không cần gõ ?polyR trước? Điều đó nói rằng ' Tính đa thức trực giao ' ở đầu trong các chữ cái lớn thân thiện.
Glen_b -Reinstate Monica

4
@Glen_b Vâng, tôi đã?polyđể hiểu cú pháp. Phải thừa nhận rằng, tôi chỉ có ít kiến ​​thức về các khái niệm đằng sau nó. Tôi không biết rằng có một cái gì đó khác (hoặc khác biệt lớn như vậy giữa đa thức "bình thường" và đa thức trực giao), và các ví dụ tôi thấy trên mạng đều được sử dụng poly()để phù hợp, đặc biệt là ggplot- vậy tại sao tôi không sử dụng nó và bối rối nếu kết quả là "sai"? Nhắc bạn, tôi không rành về toán học. Tôi chỉ đang áp dụng những gì tôi đã thấy người khác làm, và cố gắng hiểu nó.
dùng13907

Câu trả lời:


55

Câu trả lời chi tiết của tôi ở bên dưới, nhưng câu trả lời chung (nghĩa là thực) cho loại câu hỏi này là: 1) thử nghiệm, xoay quanh, nhìn vào dữ liệu, bạn không thể phá vỡ máy tính cho dù bạn có làm gì, vì vậy. . . thí nghiệm; hoặc 2) RTFM .

Đây là một số Rmã sao chép vấn đề được xác định trong câu hỏi này, ít nhiều:

# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/95939/
# 
# It is an exploration of why the result from lm(y_x+I(x^2))
# looks so different from the result from lm(y~poly(x,2))

library(ggplot2)


epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
       geom_smooth(method = "lm", formula = y ~ poly(x, 2))

summary(lm(y~x+I(x^2)))       # Looks right
summary(lm(y ~ poly(x, 2)))   # Looks like garbage

# What happened?
# What do x and x^2 look like:
head(cbind(x,x^2))

#What does poly(x,2) look like:
head(poly(x,2))

Câu đầu tiên lmtrả về câu trả lời mong đợi:

Call:
lm(formula = y ~ x + I(x^2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.92734    0.15376  25.542  < 2e-16 ***
x           -0.53929    0.11221  -4.806 5.62e-06 ***
I(x^2)       0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

Thứ hai lmtrả về một cái gì đó kỳ lạ:

Call:
lm(formula = y ~ poly(x, 2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.24489    0.02241 144.765  < 2e-16 ***
poly(x, 2)1  0.02853    0.22415   0.127    0.899    
poly(x, 2)2  1.09835    0.22415   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

lmlà giống nhau trong hai cuộc gọi, nên nó phải là đối số lmkhác nhau. Vì vậy, hãy nhìn vào các đối số. Rõ ràng, ylà như nhau. Đó là những phần khác. Chúng ta hãy xem xét một vài quan sát đầu tiên về các biến bên phải trong lệnh gọi đầu tiên của lm. Sự trở lại của head(cbind(x,x^2))hình như:

            x         
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

Đây là như mong đợi. Cột đầu tiên là xvà cột thứ hai là x^2. Làm thế nào về cuộc gọi thứ hai của lm, một cuộc gọi với poly? Sự trở lại của head(poly(x,2))hình như:

              1         2
[1,] -0.1714816 0.2169976
[2,] -0.1680173 0.2038462
[3,] -0.1645531 0.1909632
[4,] -0.1610888 0.1783486
[5,] -0.1576245 0.1660025
[6,] -0.1541602 0.1539247

OK, điều đó thực sự khác biệt. Cột thứ nhất thì không x, và cột thứ hai thì không x^2. Vì vậy, bất cứ điều gì poly(x,2), nó không trở lại xx^2. Nếu chúng ta muốn biết những gì poly, chúng ta có thể bắt đầu bằng cách đọc tệp trợ giúp của nó. Vì vậy, chúng tôi nói help(poly). Mô tả cho biết:

Trả về hoặc đánh giá các đa thức trực giao bậc 1 đến độ so với tập hợp các điểm x đã chỉ định. Đây là tất cả các trực giao với đa thức không đổi độ 0. Hoặc, đánh giá đa thức thô.

Bây giờ, hoặc bạn biết "đa thức trực giao" là gì hoặc bạn không biết. Nếu bạn không, thì hãy sử dụng Wikipedia hoặc Bing (tất nhiên không phải Google, vì Google xấu xa --- không tệ như Apple, một cách tự nhiên, nhưng vẫn tệ). Hoặc, bạn có thể quyết định rằng bạn không quan tâm đa thức trực giao là gì. Bạn có thể nhận thấy cụm từ "đa thức thô" và bạn có thể nhận thấy một chút nữa trong tệp trợ giúp polycó một tùy chọn raw, theo mặc định, bằng FALSE. Hai cân nhắc này có thể truyền cảm hứng cho bạn để thử head(poly(x, 2, raw=TRUE))trả về:

            1        2
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

Vui mừng vì khám phá này (có vẻ đúng, bây giờ, có?), Bạn có thể tiếp tục dùng thử summary(lm(y ~ poly(x, 2, raw=TRUE))) Kết quả này:

Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)              3.92734    0.15376  25.542  < 2e-16 ***
poly(x, 2, raw = TRUE)1 -0.53929    0.11221  -4.806 5.62e-06 ***
poly(x, 2, raw = TRUE)2  0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

Có ít nhất hai cấp độ cho câu trả lời trên. Đầu tiên, tôi trả lời câu hỏi của bạn. Thứ hai, và quan trọng hơn nhiều, tôi đã minh họa cách bạn phải tự mình trả lời những câu hỏi như thế này. Mỗi một người "biết cách lập trình" đã trải qua một chuỗi như trên sáu mươi triệu lần. Ngay cả những người chán nản lập trình như tôi lúc nào cũng trải qua trình tự này. Đó là bình thường cho mã không hoạt động. Đó là bình thường để hiểu sai những gì chức năng làm. Cách để đối phó với nó là xoay quanh, thử nghiệm, xem dữ liệu và RTFM. Thoát khỏi chế độ "vô thức theo một công thức" và vào chế độ "thám tử".


7
Tôi nghĩ rằng điều này xứng đáng với +6. Tôi sẽ cố gắng ghi nhớ trong một vài ngày khi điều đó trở nên có thể. FTR, tôi nghĩ rằng nó không cần phải quá mỉa mai, nhưng nó rất tốt để hiển thị các đa thức trực giao là gì / cách chúng hoạt động, và hiển thị quá trình bạn sử dụng để tìm ra những điều đó.
gung - Phục hồi Monica

13
Câu trả lời tuyệt vời, cảm ơn bạn. Mặc dù tôi hơi bị xúc phạm bởi một "RTFM" (nhưng có lẽ đó chỉ là tôi): Vấn đề là trong tất cả những gì tôi đã đọc, ít nhất là liên quan đến việc thực hiện hồi quy tuyến tính trong R, đôi khi mọi người làm điều này, những người khác làm điều đó. Thành thật mà nói, tôi không hiểu mục Wikipedia trên đa thức trực giao. Nó không xảy ra với tôi tại sao người ta sẽ sử dụng điều này để hồi quy nếu các hệ số bạn nhận được là "sai". Tôi không phải là một nhà toán học - tôi cố gắng làm theo các công thức nấu ăn bởi vì tôi không phải là một đầu bếp có học, nhưng dù sao tôi cũng cần phải ăn một cái gì đó.
dùng13907

12
@ user13907, đó không chỉ là bạn. Đây thực sự là một câu trả lời tốt đáng được bình chọn, nhưng nó sẽ có lợi khi có một giai điệu đẹp hơn.
Waldir Leoncio

8
Bạn không thực sự cần phải hiểu những gì đa thức trực giao ở đây --- bạn chỉ cần hiểu rằng chúng không phải là những gì bạn muốn. Tại sao ai đó có thể muốn đa thức trực giao? Gửi cov (poly (x, 2)) để thấy rằng hiệp phương sai giữa hai số hạng trong đa thức là 0 (lỗi tối đa). Đây là thuộc tính chính của đa thức trực giao --- các số hạng của chúng không có hiệp phương sai với nhau. Đôi khi nó thuận tiện cho các biến RHS của bạn không có mối tương quan với nhau. Hệ số của họ không sai, thực sự, họ chỉ cần được giải thích khác nhau.
Hóa đơn

2
Oh, được rồi, giải thích bằng tiếng Anh tại có ý nghĩa. Cảm ơn bạn.
dùng13907

5

Có một cách tiếp cận thú vị để giải thích hồi quy đa thức của Promotionson et al. (1978) . Nó liên quan đến việc viết lại

Y= =β0+β1X+β2X2+bạn

như

Y= =m+β2(f-X)2+bạn

m= =β0-β12/4β2β2f= =-β1/2β2


2
+1 Để biết các phân tích liên quan, vui lòng xem stats.stackexchange.com/questions/28730stats.stackexchange.com/questions/157629 .
whuber

4

Nếu bạn chỉ muốn một cú huých đúng hướng mà không có quá nhiều phán xét: poly()tạo ra các đa thức trực giao (không tương quan), trái ngược với I(), nó hoàn toàn bỏ qua mối tương quan giữa các đa thức kết quả. Mối tương quan giữa các biến dự đoán có thể là một vấn đề trong các mô hình tuyến tính (xem ở đây để biết thêm thông tin về lý do tại sao mối tương quan có thể có vấn đề), vì vậy có lẽ tốt hơn (nói chung) để sử dụng poly()thay vì I(). Bây giờ, tại sao kết quả trông rất khác nhau? Chà, cả hai poly()I()lấy x và chuyển đổi nó thành một x mới (trong trường hợp I(), x mới chỉ là x ^ 1 hoặc x ^ 2, trong trường hợp poly(), x mới phức tạp hơn nhiều (nếu bạn muốn biết họ đến từ đâu (và có lẽ bạn không biết), bạn có thể bắt đầuở đây hoặc trang Wikipedia đã nói ở trên hoặc một cuốn sách giáo khoa). Vấn đề là, khi bạn đang tính toán (dự đoán) y dựa trên một tập hợp các giá trị x, bạn cần phải sử dụng các giá trị x được chuyển đổi sản xuất bởi một trong hai poly()hoặc I()(tùy theo cái nào là trong mô hình tuyến tính của bạn). Vì thế:

library(ggplot2)    

set.seed(3)
epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
   geom_smooth(method = "lm", formula = y ~ poly(x, 2))

modI <- lm(y~x+I(x^2)) 
summary(modI) # Looks right
modp <- lm(y ~ poly(x, 2))
summary(modp)  # Looks like garbage

# predict y using modI
coef(modI)[1] + coef(modI)[2] * 3^1 + coef(modI)[3] * 3^2

# predict y using modp
# calculate the new x values using predict.poly()
x_poly <- stats:::predict.poly(object = poly(x,2), newdata = 3)
coef(modp)[1] + coef(modp)[2] * x_poly[1] + coef(modp)[3] * x_poly[2]

Trong trường hợp này, cả hai mô hình trả về cùng một câu trả lời, điều này cho thấy rằng mối tương quan giữa các biến dự đoán không ảnh hưởng đến kết quả của bạn. Nếu tương quan là một vấn đề, hai phương pháp sẽ dự đoán các giá trị khác nhau.


1

'poly' thực hiện chuẩn hóa trực giao Graham-Schmidt trên các đa thức 1, x, x ^ 2, ..., x ^ deg Ví dụ, hàm này thực hiện tương tự như 'poly' mà không trả về các thuộc tính 'coef'.

MyPoly <- 
function(x, deg)
{
    n <- length(x)
    ans <- NULL
    for(k in 1:deg)
    {
        v <- x^k
        cmps <- rep(0, n)
        if(k>0) for(j in 0:(k-1)) cmps <- cmps + c(v%*%ans[,j+1])*ans[,j+1]
        p <- v - cmps
        p <- p/sum(p^2)^0.5
        ans <- cbind(ans, p)
    }
    ans[,-1]
}

Tôi đã đến chủ đề này bởi vì tôi quan tâm đến các hình thức chức năng. Vậy làm thế nào để chúng ta biểu thị kết quả của "poly" như một biểu thức? Chỉ cần đảo ngược thủ tục Graham-Schmidt. Bạn sẽ kết thúc với một mớ hỗn độn!

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.