Подгонка кривой в R (с примерами)

Подгонка кривой в R (с примерами)

Часто вы можете захотеть найти уравнение, которое лучше всего описывает некоторую кривую в R.

Подгонка кривой в R

В следующем пошаговом примере объясняется, как подогнать кривые к данным в R с помощью функции poly() и как определить, какая кривая лучше всего подходит к данным.

Шаг 1: Создайте и визуализируйте данные

Сначала давайте создадим поддельный набор данных, а затем создадим диаграмму рассеяния для визуализации данных:

#create data frame
df <- data.frame(x=1:15,
 y=c(3, 14, 23, 25, 23, 15, 9, 5, 9, 13, 17, 24, 32, 36, 46))

#create a scatterplot of x vs. y
plot(df$x, df$y, pch= 19 , xlab='x', ylab='y') 

Шаг 2: Сопоставьте несколько кривых

Затем давайте подгоним несколько моделей полиномиальной регрессии к данным и визуализируем кривую каждой модели на одном графике:

#fit polynomial regression models up to degree 5
fit1 <- lm(y~x, data=df)
fit2 <- lm(y~poly(x,2,raw= TRUE ), data=df)
fit3 <- lm(y~poly(x,3,raw= TRUE ), data=df)
fit4 <- lm(y~poly(x,4,raw= TRUE ), data=df)
fit5 <- lm(y~poly(x,5,raw= TRUE ), data=df)

#create a scatterplot of x vs. y
plot(df$x, df$y, pch=19, xlab='x', ylab='y')

#define x-axis values
x_axis <- seq(1, 15, length= 15 )

#add curve of each model to plot
lines(x_axis, predict(fit1, data.frame(x=x_axis)), col='green')
lines(x_axis, predict(fit2, data.frame(x=x_axis)), col='red')
lines(x_axis, predict(fit3, data.frame(x=x_axis)), col='purple')
lines(x_axis, predict(fit4, data.frame(x=x_axis)), col='blue')
lines(x_axis, predict(fit5, data.frame(x=x_axis)), col='orange')

Чтобы определить, какая кривая лучше всего соответствует данным, мы можем посмотреть на скорректированный R-квадрат каждой модели.

Это значение сообщает нам процентную долю вариации переменной отклика, которая может быть объяснена предикторной переменной (переменными) в модели с поправкой на количество предикторных переменных.

#calculated adjusted R-squared of each model
summary(fit1)$adj. r.squared
summary(fit2)$adj. r.squared
summary(fit3)$adj. r.squared
summary(fit4)$adj. r.squared
summary(fit5)$adj. r.squared

[1] 0.3144819
[1] 0.5186706
[1] 0.7842864
[1] 0.9590276
[1] 0.9549709

Из вывода мы видим, что модель с самым высоким скорректированным R-квадратом является полиномом четвертой степени, у которого скорректированный R-квадрат равен 0,959 .

Шаг 3: Визуализируйте окончательную кривую

Наконец, мы можем создать диаграмму рассеяния с кривой полиномиальной модели четвертой степени:

#create a scatterplot of x vs. y
plot(df$x, df$y, pch=19, xlab='x', ylab='y')

#define x-axis values
x_axis <- seq(1, 15, length= 15 )

#add curve of fourth-degree polynomial model
lines(x_axis, predict(fit4, data.frame(x=x_axis)), col='blue')
Подгонка кривой в R

Мы также можем получить уравнение для этой строки, используя функцию summary() :

summary(fit4)

Call:
lm(formula = y ~ poly(x, 4, raw = TRUE), data = df)

Residuals:
 Min 1Q Median 3Q Max 
-3.4490 -1.1732 0.6023 1.4899 3.0351 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) -26.51615 4.94555 -5.362 0.000318 \*\*\*
poly(x, 4, raw = TRUE)1 35.82311 3.98204 8.996 4.15e-06 \*\*\*
poly(x, 4, raw = TRUE)2 -8.36486 0.96791 -8.642 5.95e-06 \*\*\*
poly(x, 4, raw = TRUE)3 0.70812 0.08954 7.908 1.30e-05 \*\*\*
poly(x, 4, raw = TRUE)4 -0.01924 0.00278 -6.922 4.08e-05 \*\*\*
---
Signif. codes: 0 ‘\*\*\*’ 0.001 ‘\*\*’ 0.01 ‘\*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.424 on 10 degrees of freedom
Multiple R-squared: 0.9707, Adjusted R-squared: 0.959 
F-statistic: 82.92 on 4 and 10 DF, p-value: 1.257e-07

Уравнение кривой выглядит следующим образом:

у = -0,0192 х 4 + 0,7081 х 3 – 8,3649 х 2 + 35,823 х – 26,516

Мы можем использовать это уравнение для прогнозирования значения переменной отклика на основе переменных-предикторов в модели. Например, если x = 4, то мы можем предсказать, что y = 23,34 :

у = -0,0192(4) 4 + 0,7081(4) 3 – 8,3649(4) 2 + 35,823(4) – 26,516 = 23,34

Дополнительные ресурсы

Введение в полиномиальную регрессию Полиномиальная регрессия в R (шаг за шагом)
Как использовать функцию seq в R

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.