Як інтерпретувати коефіцієнти з поліноміальної моделі?


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

Тепер я б припустив, що формула для моєї форми є:

бар=3.268-0,122foo+1.575foo2

Але це просто дає мені неправильні значення. Наприклад, якщо є 3, я б очікував, що стане чимось близько 3.15. Однак, вставляючи у формулу вище, я отримую: barfooбар

бар=3.268-0,1223+1.57532=17.077

Що дає? Чи я неправильно інтерпретую коефіцієнти моделі?


2
На це запитання дано відповідь у кількох
темах,

6
@whuber Якби я знав, що проблема пов'язана з "ортогональними многочленами", я, певно, знайшов би відповідь. Але якщо ви не знаєте, що шукати, це трохи важко.
користувач13907

2
Відповіді ви також можете знайти, шукаючи полі , яке помітно відображається у вашому коді. Я розміщую таку інформацію в коментарях з двох причин: (1) посилання можуть допомогти майбутнім читачам, а також вам самим, і (2) вони можуть допомогти показати вам, як використовувати нашу (дещо ідіосинкратичну) систему пошуку.
whuber

7
Ви опублікували питання, пов’язане з вашим використанням polyбез ?polyспочатку введення R? Це говорить " Обчислити ортогональні поліноми " вгорі великими дружніми літерами.
Glen_b -Встановіть Моніку

4
@Glen_b Так, добре, я зробив вигляд в ?polyрозуміти синтаксис. Щоправда, я знаю лише незначні поняття, що стоять за цим принципом. Я не знав, що є щось інше (або така велика різниця між "нормальними" поліномами і ортогональними многочленами), і приклади, які я бачив в Інтернеті, всі вони використовувалися poly()для пристосування, особливо з ggplot- так чому б я не просто використала це і плутати, якщо результат був "неправильним"? Зверніть увагу, я не вмію з математики - я просто застосовую те, що я бачив, як роблять інші, і намагаюся зрозуміти це.
користувач13907

Відповіді:


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те саме. Це інші частини. Давайте розглянемо кілька перших спостережень на правосторонніх змінних у першому виклику 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 до ступеня над заданим набором точок х. Всі вони є ортогональними до постійного многочлена ступеня 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, я думаю, це не повинно бути настільки саркастичним, але це добре допомагає показати, що таке ортогональні поліноми / як вони працюють, і показати процес, який ви використовуєте для з'ясування таких речей.
gung - Відновіть Моніку

13
Чудова відповідь, дякую. Хоча я трохи ображений "RTFM" (але, можливо, це тільки я): Проблема полягає в тому, що в усьому, що я читав, принаймні, що стосується лінійної регресії в R, люди іноді роблять це, інші роблять це. Чесно кажучи, я не розумію запис Вікіпедії на ортогональних многочленах. Мені не приходить в голову, чому можна використовувати це для регресії, якщо отримані коефіцієнти "неправильні". Я не математик - я намагаюся слідувати рецептам, бо я не навчений кухар, але все-таки мені потрібно щось їсти.
користувач13907

12
@ user13907, це не тільки ти. Це справді хороша відповідь, яка заслуговує на те, щоб бути голосованою, але це виграє від того, щоб мати приємніший тон.
Вальдір Леонсіо

8
Вам не потрібно розуміти, які тут ортогональні многочлени --- просто потрібно зрозуміти, що вони не є тим, чого ви хочете. Чому хтось може хотіти ортогональних многочленів? Подайте cov (poly (x, 2)), щоб виявити, що коваріація між двома членами в многочлени дорівнює нулю (до помилки округлення). Це ключова властивість ортогональних многочленів --- їхні умови мають нульову коваріацію один з одним. Іноді для ваших змінних RHS зручно мати нульову кореляцію між собою. Їх коефіцієнти не помиляються, насправді їх просто треба тлумачити по-різному.
Білл

2
О, добре, що пояснення простою англійською мовою тепер має сенс. Дякую.
користувач13907

5

Існує цікавий підхід до інтерпретації поліноміальної регресії Stimson et al. (1978) . Він передбачає переписування

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

як

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

m=β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 - це набагато складніше (якщо ви хочете знати звідки вони беруться (а ви, мабуть, не знаєте), можна початитут або вищезгадана сторінка Вікіпедії або підручник). Справа в тому, що коли ви обчислюєте (прогнозуєте) 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

"poly" виконує орто-нормалізацію Ґрема-Шмідта на поліномах 1, x, x ^ 2, ..., x ^ deg. Наприклад, ця функція виконує те саме, що і "poly", без повернення атрибутів "coef".

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.