Możesz poddać inżynierii wstecznej formuły splajnu bez konieczności wchodzenia w R
kod. Wystarczy to wiedzieć
Splajn jest fragmentaryczną funkcją wielomianową.
Wielomiany stopnia są określone przez ich wartości w punkcie .d + 1rere+ 1
Współczynniki wielomianu można uzyskać za pomocą regresji liniowej.
Dlatego musisz tylko utworzyć punkty między każdą parą kolejnych węzłów (w tym niejawne punkty końcowe zakresu danych), przewidzieć wartości splajnu i zresetować przewidywanie względem potęg od do . W każdym takim „bin” węzła będzie osobna formuła dla każdego elementu bazowego splajnu. Na przykład w poniższym przykładzie występują trzy węzły wewnętrzne (dla czterech przedziałów węzłów) i zastosowano splajny sześcienne ( ), co daje wielomianów sześciennych, każdy o współczynniku . Ponieważ stosunkowo wysokie mocex x d d = 3 4 × 4 = 16 d + 1 = 4 xre+ 1xxrere= 34 × 4 = 16re+ 1 = 4xsą zaangażowane, konieczne jest zachowanie całej precyzji współczynników. Jak można sobie wyobrazić, pełna formuła dla dowolnego elementu bazowego splajnu może trwać dość długo!
Jak wspomniałem już jakiś czas temu , umiejętność korzystania z danych wyjściowych jednego programu jako danych wejściowych innego programu (bez interwencji ręcznej, która może wprowadzić nieodwracalne błędy) jest przydatną umiejętnością komunikacji statystycznej. To pytanie stanowi dobry przykład zastosowania tej zasady: zamiast ręcznego kopiowania tych szesnastocyfrowych współczynników, możemy zhakować razem sposób konwersji splajnów obliczonych przez na formuły zrozumiałe dla Excela. Wszystko, co musimy zrobić, to wyodrębnić współczynniki splajnu z powyższego opisu, sformatować je do formuł podobnych do Excela, a także skopiować i wkleić je do Excela.64R
R
Ta metoda będzie działać z dowolnym oprogramowaniem statystycznym, nawet nieudokumentowanym oprogramowaniem prawnie zastrzeżonym, którego kod źródłowy jest niedostępny.
Oto przykład wzięty z pytania, ale zmodyfikowany tak, aby zawierał węzły w trzech punktach wewnętrznych ( ), a także w punktach końcowych . Wykresy pokazują wersję, a następnie renderowanie w programie Excel. Bardzo niewiele dostosowań przeprowadzono w obu środowiskach (poza określaniem kolorów w przybliżeniu, aby pasowały do domyślnych kolorów Excela).( 1 , 1000 )200 , 500 , 800( 1 , 1000 )R
R
(Pionowe szare linie siatki w R
wersji pokazują, gdzie znajdują się wewnętrzne węzły.)
Oto pełny R
kod. Jest to niewyszukany hack, polegający całkowicie na paste
funkcji umożliwiającej manipulację ciągiem. (Lepszym sposobem byłoby utworzenie szablonu formuły i wypełnienie go za pomocą poleceń dopasowywania i zastępowania ciągów).
#
# 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
Pierwsza formuła wyjściowa splajnu (spośród czterech tu wytworzonych) to
"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)"
Aby działało to w programie Excel, wystarczy usunąć otaczające znaki cudzysłowu i poprzedzić je znakiem „=”. (Przy odrobinie wysiłku możesz R
napisać plik, który po zaimportowaniu przez program Excel zawiera kopie tych formuł we wszystkich właściwych miejscach.) Wklej go do pola formuły, a następnie przeciągnij tę komórkę, aż „A1” odwołuje się do pierwszej wartość, gdzie ma być obliczony splajn. Skopiuj i wklej (lub przeciągnij i upuść) tę komórkę, aby obliczyć wartości dla innych komórek. Wypełniłem komórki B2: E: 102 tymi wzorami, odnosząc się do wartości w komórkach A2: A102.xx
rm(list=ls())
), szczególnie nie bez ostrzeżenia. Ktoś może skopiować i wkleić kod do otwartej sesji R, gdzie mają już pewne zmienne (ale żaden zwanex
,y
,df
lubspline1
) i miss, że kod wyciera swoją pracę. Czy jest to dla nich trochę głupie? Tak. Ale nadal uprzejmie jest pozwolić im zdecydować, kiedy usunąć własne zmienne.