एक बहुपद मॉडल फिट से गुणांक की व्याख्या कैसे करें?


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 होने के नाते मुझे उम्मीद है कि 3. कुछ 3.15 के आसपास बन जाएगा। हालाँकि, मुझे उपरोक्त सूत्र में सम्मिलित: बारfoobar

bar=3.2680.1223+1.57532=17.077

क्या देता है? क्या मैं मॉडल के गुणांकों की गलत व्याख्या कर रहा हूं?


2
यह सवाल कई धागे के लिए हमारी साइट खोज के द्वारा पाया जा सकता है में उत्तर दिया जाता है orthogonal बहुपद
whuber

6
@whuber अगर मुझे पता था कि समस्या "ऑर्थोगोनल पॉलीओनियम्स" के साथ थी, तो मुझे शायद इसका जवाब मिल जाएगा। लेकिन अगर आप नहीं जानते कि क्या खोजना है, तो यह थोड़ा कठिन है।
user13907

2
आप पाली पर खोज कर भी उत्तर पा सकते हैं , जो आपके कोड में प्रमुखता से दिखाई देता है। मैं दो कारणों से टिप्पणियों में ऐसी जानकारी डालता हूं: (1) लिंक भविष्य के पाठकों के साथ-साथ स्वयं को भी मदद कर सकते हैं और (2) वे आपको यह दिखाने में मदद कर सकते हैं कि हमारी (कुछ हद तक अज्ञात) खोज प्रणाली का कैसे फायदा उठाया जाए।
whuber

7
आपने पहले R में polyटाइप किए बिना अपने उपयोग से संबंधित एक प्रश्न पोस्ट किया ?poly? यह कहता है कि बड़े अनुकूल अक्षरों में शीर्ष पर ' कम्प्यूटेशनल ऑर्थोगोनल पॉलिनोमियल ' है।
ग्लेन_ब

4
@Glen_b हाँ, ठीक है, मैं किया था में टाइप ?polyवाक्य रचना को समझने के लिए। बेशक, मुझे इसके पीछे की अवधारणाओं का बहुत कम ज्ञान है। मुझे नहीं पता था कि कुछ और (या "सामान्य" बहुपद और ऑर्थोगोनल बहुपद) के बीच इतना बड़ा अंतर था, और मैंने जो उदाहरण ऑनलाइन देखे थे, वे सभी poly()फिटिंग के लिए उपयोग किए गए थे, खासकर के साथ ggplot- इसलिए मैं बस उसका उपयोग क्यों नहीं करूंगा और भ्रमित होना अगर परिणाम "गलत" था? ध्यान रहे, मैं गणित में कुशल नहीं हूं - मैं केवल वही लागू कर रहा हूं जो मैंने दूसरों को करते देखा है, और इसे समझने की कोशिश कर रहा हूं।
user13907

जवाबों:


55

मेरा विस्तृत जवाब नीचे है, लेकिन इस तरह के प्रश्न का सामान्य (यानी वास्तविक) उत्तर है: 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^2lmपाली के साथ दूसरी कॉल के बारे में कैसे ? इस 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

उपरोक्त उत्तर के कम से कम दो स्तर हैं। पहले, मैंने आपके प्रश्न का उत्तर दिया। दूसरा, और इससे भी महत्वपूर्ण बात, मैंने यह वर्णन किया कि आपको इस तरह के सवालों के जवाब देने के बारे में कैसे जाना चाहिए। हर एक व्यक्ति जो "प्रोग्राम करना जानता है" एक क्रम से गुज़रा है जैसे कि साठ लाख से ऊपर। यहां तक ​​कि लोगों को प्रोग्रामिंग में बहुत बुरा लगता है क्योंकि मैं हर समय इस क्रम से गुजरता हूं। यह काम नहीं करने के लिए कोड के लिए सामान्य है। यह गलत है कि क्या कार्य करना गलत है। इससे निपटने का तरीका यह है कि चारों ओर पेंच करना, प्रयोग करना, डेटा देखना और आरटीएफएम। अपने आप को "नासमझी के बाद एक नुस्खा" मोड में और "जासूस" मोड से बाहर निकालें।


7
मुझे लगता है कि यह +6 का हकदार है। मैं एक दो दिनों में याद करने की कोशिश करूँगा जब यह संभव हो जाएगा। FTR, मुझे लगता है कि यह बहुत व्यंग्यात्मक होने की आवश्यकता नहीं है, लेकिन यह दिखाने का एक अच्छा काम करता है कि ऑर्थोगोनल पॉलीओनियम्स क्या हैं / वे कैसे काम करते हैं, और इस तरह की चीजों का पता लगाने के लिए आप जिस प्रक्रिया का उपयोग करते हैं वह दिखाते हैं।
गूँग - मोनिका

13
शानदार जवाब, धन्यवाद। हालांकि मैं एक "RTFM" (लेकिन शायद यह सिर्फ मेरे लिए) से थोड़ा नाराज हूं: समस्या यह है कि मैंने जो भी पढ़ा है, कम से कम आर में रैखिक प्रतिगमन करने के संबंध में, लोग कभी-कभी ऐसा करते हैं, अन्य लोग ऐसा करते हैं। सच कहूँ तो मुझे ऑर्थोगोनल पॉलीओनियम्स पर विकिपीडिया प्रविष्टि की समझ नहीं है। यह मेरे लिए नहीं होता है कि क्यों कोई इस प्रतिगमन के लिए उपयोग करेगा यदि आपके द्वारा प्राप्त गुणांक "गलत" हैं। मैं एक गणितज्ञ नहीं हूं - मैं व्यंजनों का पालन करने की कोशिश करता हूं क्योंकि मैं एक सीखा रसोइया नहीं हूं, लेकिन मुझे फिर भी कुछ खाने की जरूरत है।
user13907

12
@ user13907, यह सिर्फ आप नहीं हैं। यह वास्तव में एक अच्छा जवाब है जो मतदान करने के योग्य है, लेकिन यह एक अच्छा स्वर होने से लाभ होगा।
वाल्डिर लियोनसियो

8
आपको वास्तव में यह समझने की ज़रूरत नहीं है कि ऑर्थोगोनल पॉलीओनियम्स यहाँ हैं --- आपको बस यह समझने की ज़रूरत है कि वे वही नहीं हैं जो आप चाहते हैं। किसी को ऑर्थोगोनल पॉलीओनियल्स क्यों चाहिए? कोव (पॉली (x, 2)) को यह ज्ञात करने के लिए प्रस्तुत करें कि बहुपद में दो पदों के बीच सहसंयोजी शून्य (राउंडऑफ़ त्रुटि तक) है। यह ऑर्थोगोनल पॉलीओनियम्स की प्रमुख संपत्ति है --- उनकी शर्तों में एक दूसरे के साथ शून्य सहसंयोजक है। कभी-कभी अपने आरएचएस चर के लिए एक दूसरे के साथ शून्य सहसंबंध रखना सुविधाजनक होता है। उनके गुणांक गलत नहीं हैं, वास्तव में, उन्हें बस अलग तरीके से व्याख्या करना होगा।
बिल

2
ओह, ठीक है, सादे अंग्रेजी में यह स्पष्टीकरण अब समझ में आता है। धन्यवाद।
user13907

5

स्टिमसन एट अल द्वारा बहुपद प्रतिगमन की व्याख्या के लिए एक दिलचस्प दृष्टिकोण है (1978) । इसमें पुनर्लेखन शामिल है

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

जैसा

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

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


2
+1 संबंधित विश्लेषणों के लिए कृपया आंकड़े देखें ।stackexchange.com/questions/28730 और आँकड़े . stackexchange.com/questions/157629
whuber

4

यदि आप केवल बहुत अधिक निर्णय के बिना सही दिशा में एक कुहनी चाहते हैं: poly()विरोध के रूप में रूढ़िवादी (सहसंबद्ध नहीं) बहुपद बनाता है I(), जो परिणामी बहुपद के बीच संबंध को पूरी तरह से अनदेखा करता है। भविष्यवक्ता चरों के बीच सहसंबंध रेखीय मॉडल में एक समस्या हो सकती है (देखें यहाँ क्यों सहसंबंध समस्या हो सकती है के बारे में अधिक जानकारी के लिए), तो यह शायद बेहतर (सामान्य रूप में) का उपयोग करने के लिए poly()की बजाय I()। अब, परिणाम इतने अलग क्यों दिखते हैं? खैर, दोनों poly()और I()x लेते हैं और इसे एक नए x में परिवर्तित करते हैं (के मामले में I(), नया x सिर्फ x ^ 1 या x ^ 2 है, के मामले में poly(), नया x बहुत अधिक जटिल है (यदि आप जानना चाहते हैं जहां वे आते हैं (और आप शायद नहीं), आप शुरू कर सकते हैंयहाँ या उपरोक्त विकिपीडिया पृष्ठ या एक पाठ्यपुस्तक)। बिंदु यह है, जब आप x मानों के एक विशेष सेट के आधार पर (गणना कर रहे हैं) y की गणना कर रहे हैं, तो आपको poly()या तो या I()(जो आपके रैखिक मॉडल में था) के आधार पर परिवर्तित x मानों का उपयोग करने की आवश्यकता है । इसलिए:

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

मैं इस धागे पर उतरा क्योंकि मुझे कार्यात्मक रूप में दिलचस्पी थी। तो हम एक अभिव्यक्ति के रूप में 'पाली' के परिणाम को कैसे व्यक्त करते हैं? बस ग्राहम-श्मिट प्रक्रिया को उल्टा करें। आप एक गड़बड़ के साथ समाप्त होगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.