Я знаю, как сделать базовую полиномиальную регрессию в R. Однако я могу использовать nls
или lm
для соответствия строке, которая минимизирует ошибку с точками.
Это работает большую часть времени, но иногда, когда в данных имеются пробелы измерения, модель становится очень противоречивой. Есть ли способ добавить дополнительные ограничения?
Воспроизводимый пример:
Я хочу подгонять модель к следующим составленным данным (подобно моим реальным данным):
x <- c(0, 6, 21, 41, 49, 63, 166)
y <- c(3.3, 4.2, 4.4, 3.6, 4.1, 6.7, 9.8)
df <- data.frame(x, y)
Сначала запишите его.
library(ggplot2)
points <- ggplot(df, aes(x,y)) + geom_point(size=4, col='red')
points
Похоже, что если бы мы связали эти точки с линией, это изменило бы направление 3 раза, поэтому попробуйте установить для него четверть.
lm <- lm(formula = y ~ x + I(x^2) + I(x^3) + I(x^4))
quartic <- function(x) lm$coefficients[5]*x^4 + lm$coefficients[4]*x^3 + lm$coefficients[3]*x^2 + lm$coefficients[2]*x + lm$coefficients[1]
points + stat_function(fun=quartic)
Похоже, что модель очень хорошо подходит к точкам... кроме того, потому что у наших данных был большой разрыв между 63 и 166, там есть огромный шип, который не имеет причины находиться в модели. (Для моих фактических данных я знаю, что там нет огромного пика)
Итак, вопрос в этом случае:
- Как установить максимальный локальный максимум (166, 9.8)?
Если это невозможно, то другой способ сделать это:
- Как ограничить значения y, предсказанные линией, больше, чем y = 9.8.
Или, может быть, есть лучшая модель для использования? (Кроме того, что делать это кусочно). Моя цель - сравнить особенности моделей между графиками.