У меня есть некоторые данные, которые я хотел бы сгладить так, чтобы сглаженные точки монотонно уменьшались. Мои данные резко уменьшаются и затем начинают плато. Вот пример использования R
df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()
Какую хорошую технику сглаживания я мог бы использовать? Кроме того, было бы хорошо, если бы я мог заставить первую сглаженную точку быть близкой к моей наблюдаемой точке.
plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Ответы:
Вы можете сделать это с помощью наказываться шлицы с ограничениями монотонности через
mono.con()
иpcls()
функций в mgcv пакете. Нам нужно немного поработать, потому что эти функции не так удобны для пользователя, какgam()
показано ниже, но шаги показаны ниже, в основном на примере из?pcls
, модифицированного в соответствии с данными, которые вы дали:Теперь нам нужно заполнить объект, который передается,
pcls()
содержащим детали штрафной модели с ограничениями, которую мы хотим подогнать.Теперь мы можем наконец сделать примерку
p
содержит вектор коэффициентов для базисных функций, соответствующих сплайну. Чтобы визуализировать подобранный сплайн, мы можем предсказать по модели в 100 точках в диапазоне х. Мы делаем 100 значений, чтобы получить красивую плавную линию на графике.Для генерации прогнозируемых значений мы используем
Predict.matrix()
, который генерирует матрицу, которая при умножении на коэффициентыp
дает прогнозируемые значения из подобранной модели:Это производит:
Я оставлю это на ваше усмотрение, чтобы получить данные в удобной форме для построения графиков с помощью ggplot ...
Вы можете принудительно подгонять (частично ответить на ваш вопрос о сглаживании подгонки к первой точке данных), увеличив размер базовой функции
x
. Например, установивk
равным8
(k <- 8
) и перезапустив код выше, мы получимВы не можете продвинуться
k
намного выше для этих данных, и вы должны быть осторожны с перебором; все, чтоpcls()
мы делаем, это решаем проблему штрафованных наименьших квадратов, учитывая ограничения и предоставляемые базовые функции, он не выполняет выбор гладкости для вас - не то, что я знаю ...)Если вы хотите интерполяцию, то посмотрите базовую функцию R,
?splinefun
которая имеет сплайны Эрмита и кубические сплайны с ограничениями монотонности. В этом случае вы не можете использовать это, однако, поскольку данные не являются строго монотонными.источник
splinefun
была моя первоначальная мысль (я интерполирую), ноspline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")
иspline(x=df$x, y=df$y, n=nrow(df), method="hyman")
обе ошибки вызывают?mono.con
содержит более подробную информацию о методе.splinefun
возникает ошибка; Я только что понял, что вы можете использовать монотонный сплайн, который интерполирует данные, которые сами по себе не являются монотонными. Наблюдение вx = 6
большеy
, чем вx = 5
. Вы просто должны проигнорировать эту часть ответа :-)mono.con
возвращаются для кубического сплайна.?pcls
есть примеры сплайнов на тонких пластинах и аддитивных моделей, которые менее удобны для пользователя, чем приведенные выше, но которые могут раскрыть некоторые математические знания, если вы знакомы с математикой для этих типов сплайнов (я сам не настолько знаком).Недавний мошеннический пакет Натальи Пи, основанный на статье «Модели с аддитивными формами» от Pya & Wood (2015), может значительно облегчить процесс, упомянутый в превосходном ответе Гевина.
Есть ряд функций bs, которые вы можете использовать - в приведенном выше примере я использовал mpd для «монотонного убывающего P-сплайна», но он также имеет функции, которые обеспечивают выпуклость или вогнутость либо отдельно, либо вместе с монотонными ограничениями.
источник