मेरा विस्तृत जवाब नीचे है, लेकिन इस तरह के प्रश्न का सामान्य (यानी वास्तविक) उत्तर है: 1) प्रयोग, चारों ओर पेंच, डेटा को देखो, आप कंप्यूटर को तोड़ नहीं सकते चाहे आप कुछ भी करें, इसलिए। । । प्रयोग; या 2) आरटीएफएम ।
यहाँ कुछ 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
वही है। यह अन्य भागों है। आइए पहले कॉल में दायीं ओर के चर पर पहले कुछ टिप्पणियों को देखें 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 के निर्दिष्ट सेट पर डिग्री 1 के ओर्थोगोनल पॉलीओमियल्स को रिटर्न या मूल्यांकन करता है। डिग्री 0. के निरंतर बहुपद के लिए ये सभी ऑर्थोगोनल हैं। वैकल्पिक रूप से, कच्चे बहुपद का मूल्यांकन करें।
अब, या तो आप जानते हैं कि "ऑर्थोगोनल पॉलीओनियम्स" क्या हैं या आप नहीं हैं। यदि आप नहीं करते हैं, तो विकिपीडिया या बिंग का उपयोग करें (Google नहीं, निश्चित रूप से, क्योंकि Google बुराई है --- एप्पल के रूप में बुरा नहीं है, स्वाभाविक रूप से, लेकिन बुरा है)। या, आप तय कर सकते हैं कि आपको परवाह नहीं है कि ऑर्थोगोनल पॉलीओनियम्स क्या हैं। आप "कच्चे बहुपद" वाक्यांश देख सकते हैं और आप मदद फ़ाइल में थोड़ा और नीचे देख सकते हैं जिसमें 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
उपरोक्त उत्तर के कम से कम दो स्तर हैं। पहले, मैंने आपके प्रश्न का उत्तर दिया। दूसरा, और इससे भी महत्वपूर्ण बात, मैंने यह वर्णन किया कि आपको इस तरह के सवालों के जवाब देने के बारे में कैसे जाना चाहिए। हर एक व्यक्ति जो "प्रोग्राम करना जानता है" एक क्रम से गुज़रा है जैसे कि साठ लाख से ऊपर। यहां तक कि लोगों को प्रोग्रामिंग में बहुत बुरा लगता है क्योंकि मैं हर समय इस क्रम से गुजरता हूं। यह काम नहीं करने के लिए कोड के लिए सामान्य है। यह गलत है कि क्या कार्य करना गलत है। इससे निपटने का तरीका यह है कि चारों ओर पेंच करना, प्रयोग करना, डेटा देखना और आरटीएफएम। अपने आप को "नासमझी के बाद एक नुस्खा" मोड में और "जासूस" मोड से बाहर निकालें।