Spline formüllerini R
koda girmek zorunda kalmadan tersine mühendislik yapabilirsiniz . Bunu bilmek yeterli
Spline, parçalı bir polinom fonksiyonudur.
Derece polinomları , noktalarındaki değerleri ile belirlenir .d + 1dd+ 1
Bir polinomun katsayıları doğrusal regresyon yoluyla elde edilebilir.
Bu nedenle, sadece oluşturmak zorunda , (veri aralığının kapalı uç noktaları dahil olmak üzere), birbirini takip eden düğüm çifti arasında aralıklı noktalar eğri değerlerini tahmin ve güçlerine karşı tahmini gerileme kadar . Bu düğüm "bölmeleri" içindeki her bir spline temel elemanı için ayrı bir formül olacaktır. Örneğin, aşağıdaki örnekte üç iç düğüm (dört düğüm bölmesi için) vardır ve kübik spline'lar ( ) kullanılmıştır, bu da her biri katsayılı kübik polinom ile sonuçlanır . Çünkü nispeten yüksek güçlerix x d d = 3 4 × 4 = 16 d + 1 = 4 xd+ 1xxdd= 34 × 4 = 16d+ 1 = 4xsöz konusu ise, katsayılardaki tüm hassasiyeti korumak zorunludur. Tahmin edebileceğiniz gibi, herhangi bir spline temel elementinin tam formülü oldukça uzun sürebilir!
Bir süre önce bahsettiğim gibi, bir programın çıktısını başka bir programın girdisi olarak kullanabilmek (yeniden oluşturulamayan hatalar oluşturabilen manuel müdahale olmadan) faydalı bir istatistiksel iletişim becerisidir. Bu soru, bu ilkenin nasıl uygulandığına dair güzel bir örnek sunmaktadır: on altı haneli katsayıları manuel olarak kopyalamak yerine, hesaplanan eğrileri Excel'in anlayabileceği formüllere dönüştürmenin bir yolunu bir araya getirebiliriz. Tek yapmamız gereken spline katsayılarını yukarıda açıklandığı gibi çıkarmak, bunları Excel benzeri formüllerde yeniden biçimlendirmek ve bunları kopyalayıp Excel'e yapıştırmaktır.64R
R
Bu yöntem, herhangi bir istatistiksel yazılımla, kaynak kodu kullanılamayan belgesiz özel yazılımla bile çalışacaktır.
İşte sorudan alınan ancak üç iç noktada ( ) ve uç noktalarda düğümlere sahip olacak şekilde değiştirilmiş bir örnek . Grafikler , Excel'in oluşturulmasını izleyen sürümünü gösterir . Her iki ortamda da çok az kişiselleştirme gerçekleştirildi ( yaklaşık olarak Excel'in varsayılan renkleriyle eşleşecek renkleri belirtmek dışında ).( 1 , 1000 )200 , 500 , 800( 1 , 1000 )R
R
(Sürümdeki dikey gri ızgara çizgileri R
, iç düğümlerin nerede olduğunu gösterir.)
İşte tam R
kod. Tamamen paste
dize manipülasyonunu gerçekleştirme işlevine dayanan, sofistike olmayan bir kesmek . (Formül şablonu oluşturmak ve dizgi eşleme ve değiştirme komutlarını kullanarak doldurmak daha iyi bir yol olabilir.)
#
# 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
İlk spline çıktı formülü (burada üretilen dördünden)
"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)"
Bunun Excel'de çalışması için tek yapmanız gereken çevredeki tırnak işaretlerini kaldırmak ve "=" işaretiyle önek kullanmaktır. (Biraz daha fazla çaba sarf R
ederek, Excel tarafından içe aktarıldığında bu formüllerin kopyalarını doğru yerlere içeren bir dosya yazabilirsiniz.) Bir formül kutusuna yapıştırın ve sonra "A1", spline'ın hesaplanacağı değer. Diğer hücrelerin değerlerini hesaplamak için o hücreyi kopyalayıp yapıştırın (veya sürükleyip bırakın). B2: E: 102 hücrelerini bu formüllerle doldurdum, A2: A102 hücrelerindeki değerlerine başvurdum .xxx
rm(list=ls())
) silen kodu dahil etmekten kaçınmak için özellikle herhangi bir uyarı yapmamayı öneririm . Bazı zaten değişkenleri (ancak hiçbiri denir sahip olduğu Birisi R açık oturumda içine yere yapıştırın olabilirx
,y
,df
veyaspline1
) ve bayan kodunuzu işlerini mendil söyledi. Bunu yapmaları biraz aptalca mı? Evet. Ancak, kendi değişkenlerini ne zaman sileceklerine karar vermelerine izin vermek hala kibar.