จะตีความค่าสัมประสิทธิ์จากแบบจำลองพหุนามได้อย่างไร


36

ฉันพยายามสร้างพหุนามลำดับที่สองกับข้อมูลบางอย่างที่ฉันมี สมมติว่าฉันพล็อตแบบนี้ด้วยggplot():

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

ฉันเข้าใจ:

พล็อตของพาราโบลาพอดีกับวงความเชื่อมั่นในการกระจาย

ดังนั้นคำสั่งที่สองนั้นทำงานได้ค่อนข้างดี ฉันคำนวณด้วย R:

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

และฉันได้รับ:

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

ตอนนี้ฉันจะถือว่าสูตรสำหรับความพอดีของฉันคือ:

bar=3.2680.122foo+1.575foo2

แต่นั่นก็ให้ค่าที่ไม่ถูกต้องกับฉัน ตัวอย่างเช่นเมื่อเป็น 3 ฉันจะคาดหวังว่า\ text {bar}จะกลายเป็นอะไรประมาณ 3.15 อย่างไรก็ตามการแทรกสูตรข้างต้นฉันได้รับ: barfoobar

bar=3.2680.1223+1.57532=17.077

สิ่งที่ช่วยให้? ฉันตีความตีความค่าสัมประสิทธิ์ของโมเดลไม่ถูกต้องหรือไม่


2
คำถามนี้มีคำตอบในหลายกระทู้ที่สามารถพบได้โดยการค้นหาเว็บไซต์ของเราสำหรับพหุนามแบบฉากฉาก
whuber

6
@whuber หากฉันรู้ว่าปัญหานั้นเกิดจาก "ชื่อโพลิโนเมียลแบบมุมฉาก" ฉันอาจพบคำตอบ แต่ถ้าคุณไม่รู้ว่าจะค้นหาอะไรมันก็ยากไปหน่อย
user13907

2
คุณสามารถหาคำตอบได้โดยค้นหาจากโพลีซึ่งจะปรากฏอย่างเด่นชัดในรหัสของคุณ ฉันใส่ข้อมูลดังกล่าวไว้ในความคิดเห็นด้วยเหตุผลสองประการ: (1) ลิงก์อาจช่วยผู้อ่านในอนาคตเช่นเดียวกับตัวคุณเองและ (2) พวกเขาอาจช่วยแสดงวิธีการใช้ประโยชน์จากระบบค้นหาของเรา
whuber

7
คุณโพสต์คำถามเกี่ยวกับการใช้งานpolyโดยไม่ต้องพิมพ์?polyใน R ก่อนหรือไม่? นั่นบอกว่า ' คำนวณคำพหุนามฉากชื่อพหุนาม ' ที่ด้านบนด้วยตัวอักษรขนาดใหญ่ที่เป็นมิตร
Glen_b

4
@Glen_b ใช่ดีฉันไม่พิมพ์?polyจะเข้าใจไวยากรณ์ เป็นที่ยอมรับฉันมีความรู้เพียงเล็กน้อยเกี่ยวกับแนวคิดที่อยู่เบื้องหลัง ฉันไม่รู้ว่ามีอย่างอื่นอีก (หรือความแตกต่างระหว่างชื่อพหุนาม "ปกติ" และพหุนาม orthogonal) และตัวอย่างที่ฉันเห็นออนไลน์ทั้งหมดถูกนำมาใช้poly()เพื่อความเหมาะสมโดยเฉพาะกับggplot- ดังนั้นทำไมฉันไม่ใช้มันและ จะสับสนถ้าผลที่ได้คือ "ผิด"? โปรดทราบว่าฉันไม่มีทักษะด้านคณิตศาสตร์ - ฉันแค่ประยุกต์ใช้สิ่งที่ฉันเห็นคนอื่นทำและพยายามทำความเข้าใจ
user13907

คำตอบ:


55

คำตอบโดยละเอียดของฉันอยู่ด้านล่าง แต่คำตอบทั่วไป (เช่นของจริง) ของคำถามประเภทนี้คือ: 1) การทดลองหมุนไปรอบ ๆ ดูข้อมูลคุณไม่สามารถทำลายคอมพิวเตอร์ได้ไม่ว่าคุณจะทำอะไร . . ทดลอง; หรือ 2) RTFM

นี่คือRรหัสบางส่วนที่ลอกเลียนแบบปัญหาที่ระบุในคำถามนี้ไม่มากก็น้อย:

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

lmคำตอบแรกคือคำตอบที่คาดหวัง:

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

สิ่งที่สองlmส่งคืนสิ่งที่แปลก:

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

เนื่องจากlmเหมือนกันในการเรียกสองครั้งจึงจำเป็นต้องมีอาร์กิวเมนต์lmที่แตกต่างกัน ลองดูที่ข้อโต้แย้ง เห็นได้ชัดว่าyเหมือนกัน มันเป็นส่วนอื่น ๆ ดู Let 's lmที่สังเกตไม่กี่ครั้งแรกในตัวแปรขวามือด้านในสายแรกของ การกลับมาของhead(cbind(x,x^2))ดูเหมือนว่า:

            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

นี่คือที่คาดไว้ คอลัมน์แรกคือและคอลัมน์ที่สองคือx x^2แล้วการโทรครั้งที่สองlmกับโพลีล่ะ? การกลับมาของhead(poly(x,2))ดูเหมือนว่า:

              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

ตกลงมันแตกต่างกันจริงๆ คอลัมน์แรกไม่ได้และคอลัมน์ที่สองไม่ได้x x^2ดังนั้นสิ่งที่poly(x,2)ทำก็ไม่ได้กลับมาและx x^2หากเราต้องการทราบว่าpolyทำอะไรเราอาจเริ่มด้วยการอ่านไฟล์ช่วยเหลือของมัน help(poly)ดังนั้นเราจึงบอกว่า คำอธิบายพูดว่า:

ส่งคืนหรือประเมินพหุนามแบบมุมฉากของระดับ 1 ถึงดีกรีตามชุดของคะแนน x ที่ระบุ ทั้งหมดนี้เป็นมุมฉากกับพหุนามคงที่ของระดับ 0 หรือมิฉะนั้นประเมินพหุนามดิบ

ทีนี้คุณก็รู้ว่า "พหุนามมุมฉาก" คืออะไรหรือไม่ หากคุณไม่ทำเช่นนั้นให้ใช้Wikipediaหรือ Bing (ไม่ใช่ Google แน่นอนเพราะ Google นั้นชั่วร้าย --- ไม่เลวเท่ากับ Apple ตามธรรมชาติ แต่ก็ยังไม่ดี) หรือคุณอาจตัดสินใจว่าคุณไม่สนใจว่าชื่อโพลิโนเมียลแบบฉากคืออะไร คุณอาจสังเกตเห็นวลี "มีหลายชื่อดิบ" และคุณอาจจะสังเกตเห็นลงอีกเล็ก ๆ น้อย ๆ ในแฟ้มความช่วยเหลือที่polyมีตัวเลือกซึ่งเป็นตามค่าเริ่มต้นเท่ากับraw FALSEข้อควรพิจารณาทั้งสองข้อนี้อาจเป็นแรงบันดาลใจให้คุณลองดูhead(poly(x, 2, raw=TRUE))ว่าผลตอบแทนใด:

            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

ตื่นเต้นกับการค้นพบนี้ (มันดูถูกต้องแล้วใช่มั้ย) คุณอาจลองทำsummary(lm(y ~ poly(x, 2, raw=TRUE))) สิ่งนี้คืน:

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

คำตอบข้างต้นมีอย่างน้อยสองระดับ ก่อนอื่นฉันตอบคำถามของคุณแล้ว ประการที่สองและที่สำคัญกว่านั้นฉันแสดงให้เห็นว่าคุณควรตอบคำถามด้วยตัวเองอย่างไร ทุกคนที่ "รู้วิธีการเขียนโปรแกรม" ได้ผ่านลำดับเช่นเดียวกับที่มีมากกว่าหกสิบล้านครั้ง แม้แต่คนที่แย่ในการเขียนโปรแกรมผมก็ต้องผ่านขั้นตอนนี้ตลอดเวลา เป็นเรื่องปกติที่รหัสจะไม่ทำงาน เป็นเรื่องปกติที่จะเข้าใจผิดว่าหน้าที่ใดบ้าง วิธีจัดการกับมันคือหมุนไปรอบ ๆ ทดสอบดูข้อมูลและ RTFM ออกจากโหมด "โดยไม่สนใจสูตร" และเข้าสู่โหมด "นักสืบ"


7
ฉันคิดว่านี่สมควรได้รับ +6 ฉันจะพยายามจำในสองสามวันเมื่อเป็นไปได้ FTR ฉันคิดว่ามันไม่จำเป็นต้องเหน็บแนมมากนัก แต่มันก็เป็นหน้าที่ที่ดีในการแสดงให้เห็นว่าชื่อพหุนาม orthogonal คืออะไร / พวกมันทำงานอย่างไร
gung - Reinstate Monica

13
คำตอบที่ดีขอบคุณ แม้ว่าฉันจะรู้สึกขุ่นเคืองเล็กน้อยกับ "RTFM" (แต่อาจจะเป็นแค่ฉัน): ปัญหาคือสิ่งที่ฉันได้อ่านมาอย่างน้อยก็เกี่ยวกับการถดถอยเชิงเส้นใน R บางครั้งผู้คนทำสิ่งนี้ ตรงไปตรงมาฉันไม่เข้าใจรายการวิกิพีเดียเกี่ยวกับชื่อพหุนามฉาก มันไม่ได้เกิดขึ้นกับฉันว่าทำไมใครจะใช้มันเพื่อการถดถอยถ้าค่าสัมประสิทธิ์ที่คุณได้รับนั้น "ผิด" ฉันไม่ใช่นักคณิตศาสตร์ - ฉันพยายามทำตามสูตรอาหารเพราะฉันไม่ใช่พ่อครัวที่เรียนรู้ แต่ฉันต้องกินอะไรซักอย่าง
user13907

12
@ user13907 นั่นไม่ใช่เพียงคุณ นี่เป็นคำตอบที่ดีที่ควรได้รับการโหวต แต่มันจะได้ประโยชน์จากการมีน้ำเสียงที่ดีกว่า
Waldir Leoncio

8
คุณไม่จำเป็นต้องเข้าใจว่าชื่อพหุนามแบบมุมฉากอยู่ที่นี่คุณแค่ต้องเข้าใจว่ามันไม่ใช่สิ่งที่คุณต้องการ ทำไมบางคนอาจต้องการชื่อพหุนามมุมฉาก? ส่ง cov (poly (x, 2)) เพื่อค้นหาว่าความแปรปรวนร่วมระหว่างสองคำในพหุนามเป็นศูนย์ (ขึ้นอยู่กับข้อผิดพลาดของ roundoff) นี่คือคุณสมบัติที่สำคัญของพหุนาม orthogonal --- เงื่อนไขของพวกเขามีความแปรปรวนร่วมกัน บางครั้งการที่ตัวแปร RHS ของคุณสะดวกจะไม่มีความสัมพันธ์กัน สัมประสิทธิ์ของพวกเขาไม่ผิดจริงๆพวกเขาแค่ต้องตีความแตกต่างกัน
Bill

2
โอ้โอเคว่าคำอธิบายในภาษาอังกฤษธรรมดาในขณะนี้ทำให้รู้สึก ขอขอบคุณ.
user13907

5

มีวิธีการที่น่าสนใจในการตีความการถดถอยพหุนามโดยStimson และคณะ (1978) มันเกี่ยวข้องกับการเขียนใหม่

Y=β0+β1X+β2X2+u

เช่น

Y=m+β2(fX)2+u

โดยที่เป็นขั้นต่ำหรือสูงสุด (ขึ้นอยู่กับสัญลักษณ์ของ ) และเป็นค่าโฟกัส โดยทั่วไปจะแปลงการผสมผสานสามมิติของความลาดชันเป็นรูปโค้งในสองมิติ บทความของพวกเขาให้ตัวอย่างจากรัฐศาสตร์ β 2 F = - β 1 / 2 β 2m=β0β12/4β2β2f=β1/2β2


2
+1 สำหรับการวิเคราะห์ที่เกี่ยวข้องโปรดดูstats.stackexchange.com/questions/28730และstats.stackexchange.com/questions/157629
whuber

4

หากคุณเพียงต้องการสะกิดไปในทิศทางที่ถูกต้องโดยไม่มีการตัดสินมากนัก: poly()สร้างชื่อโพลิโนเมียร์แบบมุมฉาก (ไม่สัมพันธ์กัน) ซึ่งตรงข้ามกับI()ซึ่งไม่สนใจความสัมพันธ์ระหว่าง ความสัมพันธ์ระหว่างตัวแปรอาจจะมีปัญหาในรูปแบบเชิงเส้น (ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลที่ความสัมพันธ์จะมีปัญหา) ดังนั้นมันอาจจะดีกว่า (โดยทั่วไป) เพื่อใช้แทนpoly() I()ตอนนี้ทำไมผลลัพธ์ถึงดูต่างออกไป ดีทั้งสองpoly()และI()ใช้ x และแปลงเป็น x ใหม่ (ในกรณีของI()การใหม่ x เป็นเพียง x ^ 1 หรือ x ^ 2 ในกรณีของpoly()การ x ใหม่มีความซับซ้อนมากขึ้น (ถ้าคุณต้องการที่จะรู้ว่า พวกเขามาจากไหน (และคุณอาจจะไม่) คุณสามารถเริ่มต้นได้ที่นี่หรือหน้า Wikipediaข้างต้นหรือตำราเรียน) ประเด็นก็คือเมื่อคุณกำลังคำนวณ (การทำนาย) y ตามชุดของค่า x คุณจะต้องใช้ค่า x ที่ถูกแปลงที่ผลิตโดยอย่างใดอย่างหนึ่งpoly()หรือI()(ขึ้นอยู่กับสิ่งที่อยู่ในแบบจำลองเชิงเส้นของคุณ) ดังนั้น:

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]

ในกรณีนี้ทั้งสองแบบกลับคำตอบเดียวกันซึ่งแสดงว่าความสัมพันธ์ระหว่างตัวแปรทำนายไม่ได้ส่งผลต่อผลลัพธ์ของคุณ หากความสัมพันธ์เป็นปัญหาทั้งสองวิธีจะทำนายค่าที่แตกต่างกัน


1

'โพลี' ดำเนินการเกรแฮม - ชมิดต์ออร์โธ - มาตรฐานในพหุนาม 1, x, x ^ 2, ... , x ^ deg ตัวอย่างเช่นฟังก์ชั่นนี้ทำสิ่งเดียวกันกับ

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]
}

ฉันลงจอดที่หัวข้อนี้เพราะฉันสนใจในรูปแบบการทำงาน แล้วเราจะแสดงผลลัพธ์ของ 'โพลี' ในรูปแบบนิพจน์ได้อย่างไร เพียงย้อนกลับขั้นตอนของ Graham-Schmidt คุณจะจบลงด้วยความยุ่งเหยิง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.