คำตอบโดยละเอียดของฉันอยู่ด้านล่าง แต่คำตอบทั่วไป (เช่นของจริง) ของคำถามประเภทนี้คือ: 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 ออกจากโหมด "โดยไม่สนใจสูตร" และเข้าสู่โหมด "นักสืบ"