मेरी समस्या : मैं हाल ही में एक सांख्यिकीविद् से मिला, जिसने मुझे सूचित किया कि स्प्लिन केवल डेटा की खोज के लिए उपयोगी हैं और ओवरफिटिंग के अधीन हैं, इस प्रकार भविष्यवाणी में उपयोगी नहीं हैं। उन्होंने सरल बहुपदों के साथ खोज करना पसंद किया ... जैसा कि मैं स्प्लिन का एक बड़ा प्रशंसक हूं, और यह मेरे अंतर्ज्ञान के खिलाफ जाता है, मुझे यह पता लगाने में दिलचस्पी है कि ये तर्क कितने वैध हैं, और यदि कोई विरोधी स्पलाइन का एक बड़ा समूह है- कार्यकर्ता वहां से बाहर?
पृष्ठभूमि : जब मैं अपने मॉडल का निर्माण करता हूं, तो मैं फ्रैंक हार्ल, रिग्रेशन मॉडलिंग स्ट्रैटिजिज (1) का पालन करने की कोशिश करता हूं। उनका तर्क है कि निरंतर चर की खोज के लिए प्रतिबंधित क्यूबिक स्प्लीन एक वैध उपकरण है। वह यह भी तर्क देता है कि बहुपत्नी कुछ रिश्तों जैसे कि थ्रेसहोल्ड, लॉगरिदमिक (2) के मॉडलिंग में खराब हैं। मॉडल के रैखिकता के परीक्षण के लिए वह एक एनोवा परीक्षण को सुझाता है:
मैंने स्प्लिन्स के साथ ओवरफिटिंग के लिए गुगली की है, लेकिन यह बहुत उपयोगी नहीं पाया गया है (बहुत अधिक समुद्री मील का उपयोग नहीं करने के बारे में सामान्य चेतावनी के अलावा)। इस मंच में वहाँ पट्टी मॉडलिंग, के लिए एक प्राथमिकता हो रहा है Kolassa , Harrell , गुंग ।
मैंने बहुपदों के बारे में एक ब्लॉग पोस्ट पाया, जो कि बहुपत्नी की भविष्यवाणी करने के बारे में बात करता है। पोस्ट इन टिप्पणियों के साथ समाप्त होती है:
कुछ हद तक यहाँ प्रस्तुत उदाहरण धोखा दे रहे हैं - बहुपद प्रतिगमन अत्यधिक गैर-मजबूत होने के लिए जाना जाता है। अभ्यास में बहुत बेहतर है कि बहुपद के बजाय स्पाइन का उपयोग किया जाए।
अब इसने मुझे जाँचने के लिए प्रेरित किया कि उदाहरण के साथ स्प्लिन कैसे प्रदर्शन करेंगे:
library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70
set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))
plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)
legend("top", fill=c("orange", "red","darkblue"),
legend=c("Poly", "Natural splines", "RCS - ols"))
निम्नलिखित छवि देता है:
अंत में मुझे बहुत कुछ नहीं मिला है जो मुझे पुनर्विचार करने के लिए मनाएगा, मुझे क्या याद आ रही है?
- एफए हार्रेल, रिग्रेशन मॉडलिंग रणनीतियाँ: लीनियर मॉडल्स, लॉजिस्टिक रिग्रेशन, और सरवाइवल एनालिसिस, सॉफ्टकवर रीप्रिंट ऑफ हार्डकवर 1 एड के साथ एप्लीकेशन। 2001. स्प्रिंगर, 2010।
- एफए हार्रेल, केएल ली और बीजी पोलक, "नैदानिक अध्ययन में प्रतिगमन मॉडल: प्रिडिक्टर्स और रिस्पॉन्स के बीच संबंधों का निर्धारण," जेएनसीआई जे नेटल कैंसर इंस्टेंस, वॉल्यूम। 80, नं। 15, पीपी। 1198–1202, 1988 अक्टूबर।
अपडेट करें
टिप्पणियों ने मुझे आश्चर्यचकित किया कि डेटा स्पैन के भीतर क्या होता है लेकिन असहज घटता के साथ। अधिकांश स्थितियों में मैं डेटा सीमा के बाहर नहीं जा रहा हूं, जैसा कि ऊपर दिए गए उदाहरण से संकेत मिलता है। मुझे यकीन नहीं है कि यह भविष्यवाणी के रूप में योग्य है ...
वैसे भी यहाँ एक उदाहरण है जहाँ मैं एक और अधिक जटिल रेखा बनाता हूँ जिसका अनुवाद बहुपद में नहीं किया जा सकता है। चूंकि अधिकांश अवलोकन डेटा के केंद्र में हैं, इसलिए मैंने भी अनुकरण करने की कोशिश की:
library(rms)
cmplx_line <- 1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] +
dnorm(6*(1:length(center)-length(center)/2)/length(center))*10
ds <- data.frame(cmplx_line, x=1:200)
days <- 1:140/2
set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) &
sample >= min(ds$x)]
sample_ds <- ds[sample, ]
sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)
plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)
nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)
legend("bottomright", fill=c("black", "orange","lightblue"),
legend=c("True line", "Poly", "RCS - ols"), inset=.05)
यह निम्नलिखित कथानक देता है:
अपडेट २
इस पोस्ट के बाद से मैंने एक लेख प्रकाशित किया है जो एक बड़े डेटासेट पर उम्र के लिए गैर-रैखिकता में दिखता है। पूरक विभिन्न तरीकों की तुलना करता है और मैंने इसके बारे में एक ब्लॉग पोस्ट लिखा है ।