Polinom modelindeki katsayılar nasıl yorumlanır?


36

Sahip olduğum bazı verilere ikinci dereceden bir polinom uyumu yaratmaya çalışıyorum. Diyelim ki bu uyumu şöyle çizdim ggplot():

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

Alırım:

scatterplot'taki güven bandına uygun parabolik yapı

Bu yüzden, ikinci dereceden bir form uyumu oldukça iyi çalışıyor. R ile hesaplarım:

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

Ve anladım:

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

Şimdi, benim formumun formülü olduğunu varsayardım:

bar=3.2680.122foo+1.575foo2

Ama bu sadece bana yanlış değerleri verir. Örneğin, 3 olmakla birlikte, barı 3.15 civarında bir şey haline getirmeyi beklerdim . Ancak, yukarıdaki formüle ekleyerek alıyorum: foobar

bar=3.2680.1223+1.57532=17.077

Ne oluyor? Modelin katsayılarını yanlış yorumluyor muyum?



6
@whuber Sorunun "ortogonal polinomlarla" olduğunu bilseydim, muhtemelen bir cevap bulurdum. Ama ne arayacağınızı bilmiyorsanız, biraz zor.
user13907

2
Ayrıca kodunuzda belirgin bir şekilde görünen poly üzerinde arama yaparak da cevap bulabilirsiniz . Bu tür bilgileri iki nedenden dolayı yorumlara koydum: (1) bağlantılar gelecekteki okurların yanı sıra kendiniz de yardımcı olabilir ve (2) size (biraz kendine özgü) arama sistemimizden nasıl yararlanabileceğinizi göstermeye yardımcı olabilir.
whuber

7
Önce R polyyazmadan kullanımınızla ilgili bir soru mu yayınladınız ?poly? Bu büyük dostu harflerle üstündeki ' Ortogonal Polinomları Hesaplayın ' diyor .
Glen_b

4
Evet @Glen_b, peki, yaptığımız içinde türünü ?polysözdizimi anlamak için. Kuşkusuz, arkasındaki kavramlar hakkında çok az bilgim var. Ben başka bir şey (ya da "normal" polinomların ve ortogonal polinomların arasında böyle büyük bir fark) ve ben tüm online kullanılan testere örnekler olduğunu bilmiyordum poly()özellikle ile donatılması için, ggplotyani neden - olmaz ben sadece şunu kullanabilir ve sonuç "yanlış" olsaydı şaşkın mıydı? Unutma, matematikte uzman değilim - sadece başkalarının yaptıklarını gördüm ve anlamaya çalışıyorum.
user13907

Yanıtlar:


55

Ayrıntılı cevabım aşağıda, ancak bu tür bir sorunun genel (yani gerçek) cevabı şöyledir: 1) deney yapın, etrafa bakın, verilere bakın, ne yaparsanız yapın, bilgisayarı kıramazsınız. . . deneme; veya 2) RTFM .

Aşağıda, Rbu soruda tanımlanan sorunu çoğaltan, az ya da çok kod:

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

İlk lmbeklenen yanıtı verir:

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

İkincisi lmgarip bir şey döndürür:

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

Yana lmiki arama aynıdır, bu argümanları olmak zorunda lmfarklı olan. Öyleyse tartışmalara bakalım. Açıkçası, yaynı. Diğer kısımlar. İlk çağrıdaki sağ taraf değişkenleriyle ilgili ilk birkaç gözlemi inceleyelim lm. head(cbind(x,x^2))Gibi görünüyor dönüş :

            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

Beklendiği gibi bu. Birinci sütun xve ikinci sütun x^2. lmPoli ile olan ikinci çağrıya ne dersiniz ? head(poly(x,2))Gibi görünüyor dönüş :

              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

Tamam, bu gerçekten farklı. İlk sütun değil xve ikinci sütun değil x^2. Öyleyse, ne poly(x,2)yaparsa yap, geri dönmüyor xve x^2. Ne olduğunu bilmek istiyorsak poly, yardım dosyasını okuyarak başlayabiliriz. Biz diyoruz help(poly). Açıklama diyor ki:

Belirtilen x nokta kümesi üzerinde dereceye kadar derece 1 dereceli ortogonal polinomları döndürür veya değerlendirir. Bunların hepsi derece 0 sabit polinomuna diktir. Alternatif olarak, ham polinomları değerlendirin.

Şimdi, ya “dikgen polinomların” ne olduğunu biliyorsunuz ya da bilmiyorsunuz. Bunu yapmazsanız, Wikipedia ya da Bing'i kullanın (elbette Google değil, çünkü Google kötüdür --- Apple kadar kötü değil, doğal ama yine de kötü). Veya, ortogonal polinomların ne olduğu ile ilgilenmediğinize karar verebilirsiniz. "Ham polinomlar" ifadesini fark edebilirsiniz ve yardım dosyasında , varsayılan olarak eşit olan polybir seçeneğe rawsahip olan bir miktar daha fark edebilirsiniz FALSE. Bu iki düşünce, head(poly(x, 2, raw=TRUE))hangi sonuçların alınacağını denemenize ilham verebilir :

            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

Bu keşifle heyecanlı (doğru görünüyor, şimdi, evet?), Denemeye devam edebilirsiniz summary(lm(y ~ poly(x, 2, raw=TRUE))) Bu döner:

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

Yukarıdaki cevabın en az iki seviyesi vardır. İlk önce sorunuzu cevapladım. İkincisi, ve daha da önemlisi, bu gibi soruları kendiniz cevaplamaya nasıl devam etmeniz gerektiğini açıkladım. “Nasıl programlanacağını bilen” her bir kişi, altmış milyondan fazla olan bir sıralamadan geçmiştir. Programlamada benim kadar iç karartıcı derecede kötü insanlar bile bu sıradan geçiyorlar. Kodun çalışmaması normaldir. İşlevlerin ne yaptığını yanlış anlamak normaldir. Bununla başa çıkmanın yolu, etrafta dolaşmak, deney yapmak, verilere bakmak ve RTFM'yi incelemektir. Kendinizi "bir tarifi takip etmeden akılsızca" modundan ve "dedektif" modundan çıkarın.


7
Bence bu bir +6 hak ediyor. Bu mümkün olduğunda birkaç gün içinde hatırlamaya çalışacağım. FTR, bence o kadar iğneleyici olmak gerekmiyor, ama ortogonal polinomların ne olduğunu / nasıl çalıştıklarını göstermek ve bu tür şeyleri çözmek için kullandığınız süreci göstermek iyi bir iş.
dediklerinin - Eski Monica

13
Harika cevap, teşekkür ederim. Bir "RTFM" den biraz rahatsız olmama rağmen (ama belki de bu sadece benim): Sorun şu ki, okuduğum her şeyde, en azından R'de lineer regresyon yapmak konusunda, insanlar bazen bunu yapıyor, diğerleri bunu yapıyor. Açıkçası, ortogonal polinomlarda Wikipedia girişini anlamıyorum. Aldığınız katsayılar "yanlış" ise, neden birisinin bunu regresyon için kullandığı bana gelmez. Ben bir matematikçi değilim - tarifleri izlemeye çalışıyorum çünkü öğrenilmiş bir aşçı değilim ama yine de bir şeyler yemem gerekiyor.
user13907

12
@ user13907, bu sadece siz değilsiniz. Bu gerçekten oylanmayı hak eden iyi bir cevap, ancak daha hoş bir tondan fayda görüyor.
Waldir Leoncio

8
Gerçekten ortogonal polinomların burada ne olduğunu anlamanıza gerek yok --- sadece ne istediğinizi olmadığını anlamanız gerekir. Neden birisi ortogonal polinomları isteyebilir? Polinomdaki iki terim arasındaki kovaryansın sıfır olduğunu bulmak için cov (poly (x, 2)) gönderin. Bu, ortogonal polinomların temel özelliğidir - terimleri birbirleriyle sıfır kovaryansa sahiptir. Bazen RHS değişkenlerinizin birbirleriyle sıfır korelasyon göstermesi uygundur. Katsayıları yanlış değil, gerçekten, sadece farklı yorumlamaları gerekiyor.
Bill

2
Oh, tamam, sade İngilizce'deki bu açıklama artık mantıklı geliyor. Teşekkür ederim.
user13907

5

Stimson ve ark.'nın polinom regresyonunun yorumlanmasında ilginç bir yaklaşım vardır . (1978) . Yeniden yazmayı içerir

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

gibi

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

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



4

Eğer sadece çok fazla karar vermeden doğru yönde dürtmek istiyorsanız: sonuçta ortaya çıkan polinomlar arasındaki korelasyonu tamamen görmezden gelen poly(), dik (korelasyonlu olmayan) polinomlar yaratır I(). Tahmini değişkenler arasındaki korelasyon doğrusal modellerde bir sorun olabilir ( korelasyonun neden sorunlu olabileceği konusunda daha fazla bilgi için buraya bakın ), bu nedenle kullanmak poly()yerine ( genelde) daha iyi olabilir I(). Şimdi, sonuçlar neden bu kadar farklı görünüyor? Her ikisi de poly()ve I()x'i alıp yeni bir x'e dönüştürün (bu durumda I(), yeni x sadece x ^ 1 veya x ^ 2 ise poly(), yeni x'ler çok daha karmaşıktır (bilmek istiyorsanız) nereden geldiklerini (ve muhtemelen bilmezsin), başlayabilirsinburada veya yukarıda belirtilen Vikipedi sayfası veya bir ders kitabı). Mesele şu ki, y değerini belirli bir x değeri grubuna göre hesaplarken (tahmin ederken), ya poly()da tarafından üretilen dönüştürülen x değerlerini kullanmanız gerekir I()(hangisinin doğrusal modelinizde olduğuna bağlı olarak). Yani:

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]

Bu durumda, her iki model de aynı cevabı verir; bu, yordayıcı değişkenleri arasındaki korelasyonun sonuçlarınızı etkilemediğini gösterir. Eğer korelasyon bir problem olsaydı, iki yöntem farklı değerleri öngörürdü.


1

'poly', Graham-Schmidt orto-normalizasyonunu polinomlar 1, x, x ^ 2, ..., x ^ deg üzerinde gerçekleştirir. Örneğin, bu fonksiyon elbette 'coef' özniteliklerini döndürmeden 'poly' ile aynı şeyi yapar.

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

İşlevsel formla ilgilendiğim için bu konuya girdim. Peki 'poly' sonucunu ifade olarak nasıl ifade ederiz? Sadece Graham-Schmidt prosedürünü ters çevirin. Bir karmaşa ile biteceksin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.