Как построить лм склона, смоделированного с помощью poly ()? - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужно построить отношения между x и y, где многочлены от x предсказывают y. Это делается с помощью функции poly (), чтобы убедиться, что многочлены ортогональны.

Как мне построить это соотношение, рассматривая линейные, квадратичные и кубические члены вместе? Проблема заключается в том, что коэффициенты для разных членов не масштабируются как x.

Ниже приведен пример кода. Я попытался переназначить значения контрастности для каждого полинома на x.

Это решение дает невозможные предсказанные значения.

Заранее благодарю за помощь!

С наилучшими пожеланиями, Eric

Вот пример кода:

x = sample(0:6,100,replace = TRUE)
y = (x*0.2) + (x^2*.05) + (x^3*0.001)
y = y + rnorm(100)
x = poly(x,3)
m = lm(y~x)
TAB = summary(m)$coefficients

### Reassigning the corresponding contrast values to each polynomial of x:
eq = function(x,TAB,start) { 
#argument 'start' is used to determine the position of the linear coefficient, quadratic and cubic follow
pols = poly(x,3)
x1=pols[,1]; x2=pols[,2]; x3=pols[,3]

TAB[1,1] + x1[x]*TAB[start,1] + x2[x] * TAB[start+1,1] + x3[x] * TAB[start+2,1]
}

plot(eq(0:7,TAB,2))

1 Ответ

0 голосов
/ 06 ноября 2018

На самом деле, вы можете использовать poly непосредственно в формуле для lm().

  1. y ~ poly(x, 3) в lm() может быть тем, что вы хотите.
  2. Для печати я буду использовать пакет ggplot2 с функцией geom_smooth(). Это может нарисовать подогнанную кривую. Вы должны указать
    • method = "lm" аргумент
    • и формула

library(tidyverse)

x <- sample(0:6,100,replace = TRUE)
y <- (x*0.2) + (x^2*.05) + (x^3*0.001)
eps <- rnorm(100)
(df <- data_frame(y = y + eps, x = x))
#> # A tibble: 100 x 2
#>         y     x
#>     <dbl> <int>
#>  1  3.34      4
#>  2  1.23      5
#>  3  1.38      3
#>  4 -0.115     2
#>  5  1.94      5
#>  6  3.87      6
#>  7 -0.707     3
#>  8  0.954     3
#>  9  1.19      3
#> 10 -1.34      0
#> # ... with 90 more rows

Используя ваш смоделированный набор данных,

df %>%
  ggplot() + # this should be declared at first with the data set
  aes(x, y) + # aesthetic
  geom_point() + # data points
  geom_smooth(method = "lm", formula = y ~ poly(x, 3)) # lm fit

enter image description here


Если вы хотите удалить точки: стереть geom_point()

df %>%
  ggplot() +
  aes(x, y) +
  geom_smooth(method = "lm", formula = y ~ poly(x, 3))

enter image description here


прозрачное решение: контроль alpha меньше 1

df %>%
  ggplot() +
  aes(x, y) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", formula = y ~ poly(x, 3))

enter image description here

...