Я пытаюсь создать полином второго порядка, соответствующий некоторым имеющимся у меня данным. Допустим, я заговорю это подходит с 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, я ожидаю, что станет примерно в 3,15. Однако, вставляя в приведенную выше формулу, я получаю: бар
Что дает? Я неправильно интерпретирую коэффициенты модели?
r
regression
interpretation
regression-coefficients
user13907
источник
источник
poly
без ввода?poly
R? Надпись « Вычислять ортогональные многочлены » вверху крупными дружескими буквами.?poly
понимать синтаксис. По общему признанию, я только немного знаю о понятиях позади этого. Я не знал, что было что-то еще (или такая большая разница между «нормальными» многочленами и ортогональными многочленами), и примеры, которые я видел онлайн, все использовалисьpoly()
для подгонки, особенно сggplot
- так почему бы мне просто не использовать это и быть смущенным, если результат был "неправильным"? Имейте в виду, я не разбираюсь в математике - я просто применяю то, что, как я видел, делают другие, и пытаюсь понять это.Ответы:
Мой подробный ответ ниже, но общий (то есть реальный) ответ на этот вопрос: 1) экспериментируйте, разбирайтесь, смотрите на данные, вы не можете сломать компьютер, что бы вы ни делали, так. , , эксперимент; или 2) RTFM .
Вот некоторый
R
код, который более или менее повторяет проблему, определенную в этом вопросе:Первый
lm
возвращает ожидаемый ответ:Вторая
lm
возвращает что-то странное:Поскольку
lm
в двух вызовах одинаковое значение, аргументыlm
должны быть разными. Итак, давайте посмотрим на аргументы. Очевидно,y
то же самое. Это другие части. Давайте посмотрим на первые несколько наблюдений за правыми переменными в первом вызовеlm
. Возвращениеhead(cbind(x,x^2))
выглядит так:Это как и ожидалось. Первый столбец
x
и второй столбецx^2
. Как насчет второго вызоваlm
, тот, с поли? Возвращениеhead(poly(x,2))
выглядит так:ОК, это действительно другое. Первый столбец нет
x
, а второй столбец нетx^2
. Так что, что бы ниpoly(x,2)
делали, это не возвращаетx
иx^2
. Если мы хотим знать, чтоpoly
делает, мы могли бы начать с чтения его файла справки. Так и говоримhelp(poly)
. В описании сказано:Теперь либо вы знаете, что такое "ортогональные полиномы", либо нет. Если вы этого не сделаете, то используйте Википедию или Bing (конечно, не Google, потому что Google злой - естественно, не такой плохой, как Apple, но все же плохой). Или вы можете решить, что вам все равно, что такое ортогональные многочлены. Вы можете заметить фразу «необработанные полиномы» и заметить немного дальше в файле справки,
poly
уraw
которого есть опция, которая по умолчанию равнаFALSE
. Эти два соображения могут вдохновить вас попробовать,head(poly(x, 2, raw=TRUE))
какой возврат:Взволнованный этим открытием (оно выглядит правильно, сейчас, да?), Вы можете попробовать
summary(lm(y ~ poly(x, 2, raw=TRUE)))
это. Возвращает:На ответ выше есть как минимум два уровня. Сначала я ответил на ваш вопрос. Во-вторых, и, что гораздо важнее, я проиллюстрировал, как вы должны сами отвечать на подобные вопросы. Каждый человек, который «знает, как программировать», прошел последовательность, подобную приведенной выше, шестьдесят миллионов раз. Даже люди, столь же удручающе плохие в программировании, как и я, постоянно проходят через эту последовательность. Это нормально, когда код не работает. Нормально неправильно понимать, что делают функции. Способ справиться с этим - обойтись, поэкспериментировать, посмотреть на данные и RTFM. Выйдите из режима «бездумного следования рецепту» и «детективного» режима.
источник
Существует интересный подход к интерпретации полиномиальной регрессии Stimson et al. (1978) . Это включает в себя переписывание
как
источник
Если вы просто хотите подтолкнуть в правильном направлении без особого суждения:
poly()
создайте ортогональные (не коррелированные) полиномы, в отличие отI()
, что полностью игнорирует корреляцию между результирующими полиномами. Корреляция между переменными предиктора может быть проблемой в линейных моделях (см. Здесь для получения дополнительной информации о том, почему корреляция может быть проблематичной), поэтому, вероятно, лучше (в общем) использоватьpoly()
вместоI()
. Теперь, почему результаты выглядят такими разными? Ну, иpoly()
иI()
возьмите x и преобразовать его в новый x (в случаеI()
, новый x просто x ^ 1 или x ^ 2, в случаеpoly()
, новые x намного сложнее (если вы хотите знать, откуда они (а вы, вероятно, нет), вы можете начатьздесь или вышеупомянутая страница Википедии или учебник). Дело в том, что когда вы вычисляете (прогнозируете) y на основе определенного набора значений x, вам необходимо использовать преобразованные значения x, полученные либоpoly()
или, либоI()
(в зависимости от того, какое из них было в вашей линейной модели). Так:В этом случае обе модели возвращают один и тот же ответ, что предполагает, что корреляция между переменными предиктора не влияет на ваши результаты. Если бы корреляция была проблемой, оба метода предсказывали бы разные значения.
источник
'poly' выполняет орто-нормализацию Грэма-Шмидта для полиномов 1, x, x ^ 2, ..., x ^ deg. Например, эта функция делает то же самое, что и 'poly', не возвращая атрибуты 'coef', конечно.
Я попал в эту ветку, потому что меня интересовала функциональная форма. Итак, как мы можем выразить результат 'poly' как выражение? Просто переверните процедуру Грэма-Шмидта. Вы получите беспорядок!
источник