Я экспериментировал с множеством различных функций сплайнов, доступных в R, чтобы охарактеризовать очень маленький набор данных. Я полагаю, что с гораздо большим набором данных любое количество кривых будет вести себя так, как я ожидал бы, но данные в этом случае ограничены. Приведенный ниже код показывает пример типов данных, с которыми я работаю:Функции сплайна для небольших наборов данных в R
library(ggplot2); library(stats)
dat <- data.frame(x = c(0.333, 0.5, 1, 2, 3, 4, 5),
y = c(5.875e-03, 1.225e-02, 3.902e-02, 8.942e-03,
4.277e-03, 1.938e-03, 1.131e-03))
mod <- splinefun(dat$x, dat$y, method = "monoH.FC")
mod <- data.frame(x = seq(0.333, 5, by = 0.1), y = mod(seq(0.333, 5, by = 0.1)))
ggplot() + geom_point(data = dat, aes(x = x, y = y)) +
geom_line(data = mod, aes(x = x, y = y))
До сих пор, монотонный Эрмит сплайн, что подходит лучше всего, но он все еще имеет некоторые проблемы.
Интуитивно я могу рассказать вам, как должна выглядеть кривая. Он должен иметь максимум x = 1
и не должен иметь этот провал на x = 2.5
. Кривая не кажется, что ее трудно воссоздать; он асимметричен с левым перекосом и предсказуемым хвостом.
Есть ли лучший способ создать сплайн-функцию, которая более правильно подходит (что я предполагаю) общий набор данных, или, альтернативно, есть лучший инструмент, чем сплайны для подгонки кривых к небольшим наборам данных?
Вы проверили пакет 'rms'? Он полон удобных функций для установки кривых. –