คุณสามารถทำวิศวกรรมย้อนกลับสูตร spline โดยไม่ต้องเข้าไปในR
รหัส พอเพียงที่จะรู้ว่า
เส้นโค้งเป็นฟังก์ชันพหุนามแบบชิ้นเดียว
พหุนามของดีกรีนั้นพิจารณาจากค่าของพวกเขาที่คะแนนd + 1dd+ 1
ค่าสัมประสิทธิ์ของพหุนามสามารถหาได้จากการถดถอยเชิงเส้น
ดังนั้นคุณจะต้องสร้างจุดระยะห่างระหว่างคู่ของนอตต่อเนื่อง (รวมถึงปลายทางโดยนัยของช่วงข้อมูล) โดยคาดการณ์ค่าเส้นโค้งและถอยหลังคำทำนายต่ออำนาจของถึง d จะมีสูตรแยกต่างหากสำหรับองค์ประกอบพื้นฐานแต่ละเส้นโค้งภายใน "bin" ปมแต่ละอัน ตัวอย่างเช่นในตัวอย่างด้านล่างมีปมภายในสามอัน (สำหรับถังขยะปมสี่อัน) และลูกบาศก์ splines ( ) ถูกนำมาใช้ทำให้เกิดลูกบาศก์พหุนามหลายลูกบาศก์แต่ละตัวมีค่าสัมประสิทธิ์เพราะพลังที่ค่อนข้างสูงของx x d d = 3 4 × 4 = 16 d + 1 = 4 xd+ 1xxdd= 34 × 4 = 16d+ 1 = 4xมีส่วนร่วมมันเป็นสิ่งจำเป็นเพื่อรักษาความแม่นยำทั้งหมดในสัมประสิทธิ์ อย่างที่คุณอาจจินตนาการว่าสูตรเต็มรูปแบบสำหรับองค์ประกอบพื้นฐานใด ๆ จะมีความยาวพอสมควร!
ดังที่ฉันได้กล่าวไปเมื่อไม่นานมานี้ความสามารถในการใช้เอาต์พุตของโปรแกรมหนึ่งเป็นอินพุตของอีกโปรแกรมหนึ่ง (โดยไม่มีการแทรกแซงด้วยตนเองซึ่งสามารถแนะนำข้อผิดพลาดที่ไม่สามารถพิสูจน์ได้) เป็นทักษะการสื่อสารทางสถิติที่มีประโยชน์ คำถามนี้ให้ตัวอย่างที่ดีเกี่ยวกับวิธีใช้หลักการนั้น: แทนที่จะคัดลอกสัมประสิทธิ์สิบหกหลักด้วยตนเองเราสามารถแฮ็กวิธีแปลง splines ที่คำนวณโดยเป็นสูตรที่ Excel เข้าใจได้ สิ่งที่เราต้องทำคือแยกค่าสัมประสิทธิ์ spline จากที่อธิบายไว้ข้างต้นมีการจัดรูปแบบเหล่านั้นลงในสูตรเหมือน Excel และคัดลอกและวางลงใน Excel64R
R
วิธีนี้จะทำงานร่วมกับซอฟต์แวร์ทางสถิติใด ๆ แม้แต่ซอฟต์แวร์ที่ไม่มีเอกสารซึ่งไม่มีซอร์สโค้ด
นี่คือตัวอย่างที่นำมาจากคำถาม แต่ปรับเปลี่ยนให้มีปมที่สามจุดภายใน ( ) เช่นเดียวกับที่ปลายทาง1000) พล็อตแสดงเวอร์ชันของตามด้วยการเรนเดอร์ของ Excel มีการปรับแต่งเล็กน้อยมากในทั้งสองสภาพแวดล้อม (นอกเหนือจากการระบุสีให้ตรงกับสีเริ่มต้นของ Excel โดยประมาณ)( 1 , 1,000 )200 , 500 , 800( 1 , 1,000 )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
สูตรเอาต์พุต spline แรก (จากสี่ที่ผลิตที่นี่) คือ
"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" อ้างอิงก่อนค่าที่จะคำนวณ spline คัดลอกและวาง (หรือลากและวาง) เซลล์นั้นเพื่อคำนวณค่าสำหรับเซลล์อื่น ฉันเติมเซลล์ B2: E: 102 ด้วยสูตรเหล่านี้โดยอ้างอิงค่าในเซลล์ A2: A102xxx
rm(list=ls())
) โดยเฉพาะอย่างยิ่งไม่ได้โดยไม่มีการเตือนใด ๆ บางคนอาจคัดลอกวางรหัสของคุณลงในเซสชั่นที่เปิดกว้างของ R ที่พวกเขามีตัวแปรบางอยู่แล้ว ( แต่ไม่มีใครเรียกว่าx
,y
,df
หรือspline1
) และพลาดว่ารหัสของคุณเช็ดออกงานของพวกเขา เป็นเรื่องที่ทำให้พวกเขาโง่หรือไม่? ใช่. แต่มันก็ยังสุภาพที่จะให้พวกเขาตัดสินใจว่าจะลบตัวแปรของตัวเองเมื่อใด