Я пытаюсь подобрать сплайн для GLM с использованием R. После того, как я подгоню сплайн, я хочу иметь возможность взять свою результирующую модель и создать файл моделирования в книге Excel.
Например, допустим, у меня есть набор данных, где y - случайная функция от x, и наклон резко меняется в определенной точке (в данном случае @ x = 500).
set.seed(1066)
x<- 1:1000
y<- rep(0,1000)
y[1:500]<- pmax(x[1:500]+(runif(500)-.5)*67*500/pmax(x[1:500],100),0.01)
y[501:1000]<-500+x[501:1000]^1.05*(runif(500)-.5)/7.5
df<-as.data.frame(cbind(x,y))
plot(df)
Теперь я подхожу к этому, используя
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
и мои результаты показывают
summary(spline1)
Call:
glm(formula = y ~ ns(x, knots = c(500)), family = Gamma(link = "log"),
data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-4.0849 -0.1124 -0.0111 0.0988 1.1346
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.17460 0.02994 139.43 <2e-16 ***
ns(x, knots = c(500))1 3.83042 0.06700 57.17 <2e-16 ***
ns(x, knots = c(500))2 0.71388 0.03644 19.59 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for Gamma family taken to be 0.1108924)
Null deviance: 916.12 on 999 degrees of freedom
Residual deviance: 621.29 on 997 degrees of freedom
AIC: 13423
Number of Fisher Scoring iterations: 9
На данный момент, я могу использовать функцию предикторов в r и получить совершенно приемлемые ответы. Проблема в том, что я хочу использовать результаты модели для создания рабочей книги в Excel.
Насколько я понимаю, функция предикта состоит в том, что при заданном новом значении «x» r добавляет этот новый x в соответствующую функцию сплайна (либо в функцию для значений выше 500, либо в функцию для значений ниже 500), а затем принимает этот результат и умножает это с соответствующим коэффициентом и с этой точки зрения обрабатывает это как любой другой модельный термин. Как мне получить эти сплайн-функции?
(Примечание: я понимаю, что гамма-GLM с привязкой к журналу может не подходить для предоставленного набора данных. Я не спрашиваю о том, как и когда подходить для GLM. Я предоставляю этот набор в качестве примера для целей воспроизводимости.)
rm(list=ls())
), особенно без предупреждения. Кто - то может скопировать и вставить код в открытую сессию R , где у них есть некоторые переменные уже (но ни один называемыеx
,y
,df
илиspline1
) и пропустить , что ваш код вытирает свою работу. Для них это глупо? Да. Но все же вежливо разрешать им решать, когда удалять свои собственные переменные.Ответы:
Вы можете перепроектировать сплайн-формулы без необходимости углубляться в
R
код. Достаточно знать, чтоСплайн является кусочно-полиномиальной функцией.
Полиномы степени определяются их значениями в точках .д + 1d d+ 1
Коэффициенты полинома могут быть получены с помощью линейной регрессии.
Таким образом, вам нужно всего лишь создать точку, разнесенную между каждой парой последовательных узлов (включая неявные конечные точки диапазона данных), предсказать значения сплайнов и регрессировать прогноз по степеням от до . Там будет отдельная формула для каждого базового элемента сплайна в каждом таком узле "корзина". Например, в приведенном ниже примере используются три внутренних узла (для четырех ячеек с узлами) и кубические сплайны ( ), в результате чего получается кубических полиномов, каждый с коэффициентами. Потому что относительно высокие степениx x d d = 3 4 × 4 = 16 d + 1 = 4 xd+ 1 Икс Иксd d= 3 4 × 4 = 16 d+ 1 = 4 Икс участвуют, обязательно сохранить всю точность в коэффициентах. Как вы можете себе представить, полная формула для любого базового элемента сплайна может быть довольно длинной!
Как я упоминал довольно давно , возможность использовать выходные данные одной программы в качестве входных данных для другой (без ручного вмешательства, которое может привести к невоспроизводимым ошибкам) является полезным навыком статистической коммуникации. Этот вопрос представляет собой хороший пример того, как применяется этот принцип: вместо того, чтобы копировать эти шестнадцатизначных коэффициента вручную, мы можем объединить способ преобразования вычисленных сплайнов в формулы, понятные для Excel. Все, что нам нужно сделать, это извлечь сплайн-коэффициенты, как описано выше, переформатировать их в Excel-подобные формулы, а затем скопировать и вставить их в Excel.64
R
R
Этот метод будет работать с любым статистическим программным обеспечением, даже недокументированным проприетарным программным обеспечением, исходный код которого недоступен.
Вот пример, взятый из вопроса, но модифицированный, чтобы иметь узлы в трех внутренних точках ( ), а также в конечных точках . На графиках показана версия с последующим рендерингом в Excel. Очень мало настроек было выполнено в любой среде (кроме указания цветов, чтобы приблизительно соответствовать цветам Excel по умолчанию).( 1 , 1000 )200 , 500 , 800 ( 1 , 1000 )
R
R
(Вертикальные серые линии сетки в
R
версии показывают, где находятся внутренние узлы.)Вот полный
R
код. Это несложный хак, полностью полагающийся наpaste
функцию, выполняющую манипуляции со строками. (Лучше было бы создать шаблон формулы и заполнить его с помощью команд сопоставления строк и подстановки.)Первая формула сплайн-вывода (из четырех произведенных здесь)
Чтобы это работало в Excel, все, что вам нужно сделать, это удалить окружающие кавычки и поставить перед ними знак «=». (Приложив немного больше усилий, вы могли быИкс Икс
R
написать файл, который при импорте в Excel будет содержать копии этих формул во всех нужных местах.) Вставьте его в поле формулы и затем перетаскивайте эту ячейку вокруг, пока «A1» не будет ссылаться на первый значение, где сплайн должен быть вычислен. Скопируйте и вставьте (или перетащите) эту ячейку, чтобы вычислить значения для других ячеек. Я заполнил ячейки B2: E: 102 этими формулами, ссылаясь значения в ячейках A2: A102.хисточник
ns.formula
.. ты думаешь в R ?! Серьезно, хотя ваш метод выглядит очень полезным, но кажется нелепым взламывать хак, чтобы получить эти параметры. Было бы очень полезно вывести таблицу ..Вы уже сделали следующее:
Теперь я покажу вам, как предсказать (ответ) для x = 12 двумя различными способами: во-первых, использовать функцию предиката (самый простой способ!)
2-й способ основан на модели матрицы напрямую. Примечание, которое я использовал,
exp
так как используемая функция ссылки - log.Обратите внимание, что выше я извлек 12-й элемент, поскольку он соответствует x = 12. Если вы хотите сделать прогноз для х вне обучающего набора, то вы просто можете снова использовать функцию прогнозирования. Допустим, мы хотим найти прогнозируемое значение ответа для x = 1100, тогда
источник
Возможно, вам будет проще использовать усеченную степень мощности для сплайнов кубической регрессии, используя
rms
пакет R. Как только вы подгоняете модель, вы можете получить алгебраическое представление подогнанной сплайновой функции, используя функцииFunction
или .latex
rms
источник
Function()
действительно не говорит, что это делает. В моем случае (см. Подробности на Rpubs rpubs.com/EmilOWK/rms_splines ), я получаюfunction(x = NA) {-2863.7787+245.72672* x-0.1391794*pmax(x-10.9,0)^3+0.27835881*pmax(x-50.5,0)^3-0.1391794*pmax(x-90.1,0)^3 } <environment: 0x556156e80db8>
.-2863.7787
Значение - первая коэффи- циент в модели,245.72672
вторая, и последняя коэффи- циент-873.0223
нигде не виден в уравнении. То же самое относится и к выводуlatex()
.Function
работает,Glm()
когда вы используетеrcs
в качестве функции сплайна. Вывод перефразирует сплайн в простейшей форме, написав так, как будто нет ограничений линейного хвоста (но они есть), как подробно описано в моих заметках курса RMS .