Нелинейная регрессия
Нелинейная регрессия — статистический метод, который используется для моделирования взаимосвязи между зависимой переменной и одной или несколькими независимыми переменными. Некоторые примеры нелинейных регрессионных моделей: полиномиальная, экспоненциальная, логарифмическая… Чтобы выполнить нелинейную регрессию в R, используется функция nls(). Она требует начального предположения для параметров модели. Для получения информации о качестве соответствия нелинейной регрессионной модели можно применять функцию Summary().
Нелинейная регрессия — это статистический метод, который используется для моделирования взаимосвязи между зависимой переменной и одной из независимых переменных. При нелинейной регрессии взаимосвязь моделируется с использованием нелинейного уравнения. Это означает, что модель может фиксировать более сложные и нелинейные взаимосвязи между переменными, но также требует большего количества вычислительных ресурсов и более сложного подхода к оценке параметров модели.
Мы реализуем модель нелинейной регрессии на языке программирования R.
Прежде, чем начать, убедитесь, что установлены следующие пакеты:
install.packages(“minpack.lm”)
install.packages(“ggplot2”)
Пример 1
В этом примере демонстрируется экспоненциальная регрессия в R с использованием пакетов ggplot2 и nls.
Мы начинаем с загрузки необходимых библиотек и создания выборочных данных для независимой переменной x и зависимой переменной y.
Затем модель подгоняется с помощью функции nls(), которая выполняет нелинейную оценку методом наименьших квадратов. В этом случае мы определяем взаимосвязь между x и y с помощью формулы: y=a⋅exp(b⋅x)
Это экспоненциальная функция с параметрами a и b. Начальные значения этих параметров задаются с помощью аргумента start в качестве list(a = 4, b = 2) для управления процессом подбора.
library(minpack.lm)
library(ggplot2)
x <- c(0, 1, 2, 3, 4, 5)
y <- c(1, 2, 4, 8, 16, 32)
start_values <- c(a=4, b=2)
fit <- nls(y ~ a * exp(b * x),
start = start_values,
algorithm = "port",
control = nls.control(maxiter = 1000))
summary(fit)
> summary(fit) Formula: y ~ a * exp(b * x) Parameters: Estimate Std. Error t value Pr(>|t|) a 1.000e+00 6.762e-14 1.479e+13 <2e-16 *** b 6.931e-01 1.434e-14 4.832e+13 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 3.498e-13 on 4 degrees of freedom Algorithm "port", convergence message: absolute function convergence (6) |
Построение линии экспоненциальной регрессии с точками
ggplot(data.frame(x, y), aes(x, y)) +
geom_point() +
geom_line(aes(x, predict(fit, newdata = data.frame(x)))) +
ggtitle("Экспоненциальная регрессия") +
xlab("x") +
ylab("y")
Пример 2
Этот пример иллюстрирует полиномиальную регрессию второй степени в R с использованием ggplot2пакета для визуализации и lm() функции из базовой версии R для подбора модели. Независимая переменная x определяется как последовательность целых чисел от 1 до 10, а зависимая переменная y генерируется с помощью уравнения: y=x2+x+2+random noise
Случайный шум вводится с помощью функции rnorm() со средним значением 0 и стандартным отклонением 10 для имитации реальной изменчивости. Создаётся фрейм данных df, содержащий значения x и y. Затем с помощью lm(y ~ poly(x, 2), data = df), где poly(x, 2) обозначает полином второй степени, подгоняется модель полиномиальной регрессии.
#data
set.seed(5)
x <- 1:10
y <- x^2 + x + 2 + rnorm(10, 0, 10)
df <- data.frame(x, y)
#fitting the model
fit <- lm(y ~ poly(x, 2), data = df)
summary(fit)
> summary(fit) Call: lm(formula = y ~ poly(x, 2), data = df) Residuals: Min 1Q Median 3Q Max -12.585 -5.923 -2.564 3.630 16.773 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 45.211 3.388 13.345 3.11e-06 *** poly(x, 2)1 106.947 10.714 9.982 2.16e-05 *** poly(x, 2)2 20.057 10.714 1.872 0.103 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 10.71 on 7 degrees of freedom Multiple R-squared: 0.9364, Adjusted R-squared: 0.9183 F-statistic: 51.57 on 2 and 7 DF, p-value: 6.47e-05 |
Построим линию регрессии
library(ggplot2)
#plotting the model
ggplot(df, aes(x, y)) +
geom_point() +
geom_line(aes(x, predict(fit))) +
ggtitle("Полиномиальная регрессия")
Пример 3. Совместим в одной формуле несколько функций
library(minpack.lm)
library(ggplot2)
x <- seq(0, 10, 0.25)
y <- 4*exp(0.5*x) - 3*x^2 - 2*x + 10
start_values <- c(a=1, b=1, c=1, d=1, e=1)
fit <- nls(y ~ a*exp(b*x) + c*x^2 + d*x + e,
start = start_values,
algorithm = "port",
control = nls.control(maxiter = 5000))
summary(fit)
cor(y,predict(fit))
ggplot(data.frame(x, y), aes(x, y)) +
geom_point() +
geom_line(aes(x, predict(fit, newdata = data.frame(x)))) +
ggtitle("Экспоненциальная регрессия") +
xlab("x") +
ylab("y")


