Вы можете перепроектировать сплайн-формулы без необходимости углубляться в R
код. Достаточно знать, что
Сплайн является кусочно-полиномиальной функцией.
Полиномы степени определяются их значениями в точках .д + 1dd+ 1
Коэффициенты полинома могут быть получены с помощью линейной регрессии.
Таким образом, вам нужно всего лишь создать точку, разнесенную между каждой парой последовательных узлов (включая неявные конечные точки диапазона данных), предсказать значения сплайнов и регрессировать прогноз по степеням от до . Там будет отдельная формула для каждого базового элемента сплайна в каждом таком узле "корзина". Например, в приведенном ниже примере используются три внутренних узла (для четырех ячеек с узлами) и кубические сплайны ( ), в результате чего получается кубических полиномов, каждый с коэффициентами. Потому что относительно высокие степениx x d d = 3 4 × 4 = 16 d + 1 = 4 xd+ 1ИксИксdd= 34 × 4 = 16d+ 1 = 4Иксучаствуют, обязательно сохранить всю точность в коэффициентах. Как вы можете себе представить, полная формула для любого базового элемента сплайна может быть довольно длинной!
Как я упоминал довольно давно , возможность использовать выходные данные одной программы в качестве входных данных для другой (без ручного вмешательства, которое может привести к невоспроизводимым ошибкам) является полезным навыком статистической коммуникации. Этот вопрос представляет собой хороший пример того, как применяется этот принцип: вместо того, чтобы копировать эти шестнадцатизначных коэффициента вручную, мы можем объединить способ преобразования вычисленных сплайнов в формулы, понятные для Excel. Все, что нам нужно сделать, это извлечь сплайн-коэффициенты, как описано выше, переформатировать их в Excel-подобные формулы, а затем скопировать и вставить их в Excel.64R
R
Этот метод будет работать с любым статистическим программным обеспечением, даже недокументированным проприетарным программным обеспечением, исходный код которого недоступен.
Вот пример, взятый из вопроса, но модифицированный, чтобы иметь узлы в трех внутренних точках ( ), а также в конечных точках . На графиках показана версия с последующим рендерингом в Excel. Очень мало настроек было выполнено в любой среде (кроме указания цветов, чтобы приблизительно соответствовать цветам Excel по умолчанию).( 1 , 1000 )200 , 500 , 800( 1 , 1000 )R
R
(Вертикальные серые линии сетки в R
версии показывают, где находятся внутренние узлы.)
Вот полный R
код. Это несложный хак, полностью полагающийся на paste
функцию, выполняющую манипуляции со строками. (Лучше было бы создать шаблон формулы и заполнить его с помощью команд сопоставления строк и подстановки.)
#
# Create and display a spline basis.
#
x <- 1:1000
n <- ns(x, knots=c(200, 500, 800))
colors <- c("Orange", "Gray", "tomato2", "deepskyblue3")
plot(range(x), range(n), type="n", main="R Version",
xlab="x", ylab="Spline value")
for (k in attr(n, "knots")) abline(v=k, col="Gray", lty=2)
for (j in 1:ncol(n)) {
lines(x, n[,j], col=colors[j], lwd=2)
}
#
# Export this basis in Excel-readable format.
#
ns.formula <- function(n, ref="A1") {
ref.p <- paste("I(", ref, sep="")
knots <- sort(c(attr(n, "Boundary.knots"), attr(n, "knots")))
d <- attr(n, "degree")
f <- sapply(2:length(knots), function(i) {
s.pre <- paste("IF(AND(", knots[i-1], "<=", ref, ", ", ref, "<", knots[i], "), ",
sep="")
x <- seq(knots[i-1], knots[i], length.out=d+1)
y <- predict(n, x)
apply(y, 2, function(z) {
s.f <- paste("z ~ x+", paste("I(x", 2:d, sep="^", collapse=")+"), ")", sep="")
f <- as.formula(s.f)
b.hat <- coef(lm(f))
s <- paste(c(b.hat[1],
sapply(1:d, function(j) paste(b.hat[j+1], "*", ref, "^", j, sep=""))),
collapse=" + ")
paste(s.pre, s, ", 0)", sep="")
})
})
apply(f, 1, function(s) paste(s, collapse=" + "))
}
ns.formula(n) # Each line of this output is one basis formula: paste into Excel
Первая формула сплайн-вывода (из четырех произведенных здесь)
"IF(AND(1<=A1, A1<200), -1.26037447288906e-08 + 3.78112341937071e-08*A1^1 + -3.78112341940948e-08*A1^2 + 1.26037447313669e-08*A1^3, 0) + IF(AND(200<=A1, A1<500), 0.278894459758071 + -0.00418337927419299*A1^1 + 2.08792741929417e-05*A1^2 + -2.22580643138594e-08*A1^3, 0) + IF(AND(500<=A1, A1<800), -5.28222778473101 + 0.0291833541927414*A1^1 + -4.58541927409268e-05*A1^2 + 2.22309136420529e-08*A1^3, 0) + IF(AND(800<=A1, A1<1000), 12.500000000002 + -0.0375000000000067*A1^1 + 3.75000000000076e-05*A1^2 + -1.25000000000028e-08*A1^3, 0)"
Чтобы это работало в Excel, все, что вам нужно сделать, это удалить окружающие кавычки и поставить перед ними знак «=». (Приложив немного больше усилий, вы могли бы R
написать файл, который при импорте в Excel будет содержать копии этих формул во всех нужных местах.) Вставьте его в поле формулы и затем перетаскивайте эту ячейку вокруг, пока «A1» не будет ссылаться на первый значение, где сплайн должен быть вычислен. Скопируйте и вставьте (или перетащите) эту ячейку, чтобы вычислить значения для других ячеек. Я заполнил ячейки B2: E: 102 этими формулами, ссылаясь значения в ячейках A2: A102.хИксИкс
rm(list=ls())
), особенно без предупреждения. Кто - то может скопировать и вставить код в открытую сессию R , где у них есть некоторые переменные уже (но ни один называемыеx
,y
,df
илиspline1
) и пропустить , что ваш код вытирает свою работу. Для них это глупо? Да. Но все же вежливо разрешать им решать, когда удалять свои собственные переменные.