আমার সমস্যা : আমি সম্প্রতি একজন পরিসংখ্যানবিদের সাথে সাক্ষাত করেছিলাম যা আমাকে জানিয়েছিল যে স্প্লাইনগুলি কেবল ডেটা অন্বেষণের জন্য কার্যকর এবং অতিরিক্ত মানানসইয়ের শিকার হয়, সুতরাং ভবিষ্যদ্বাণীতে এটি কার্যকর নয়। তিনি সরল বহুবর্ষের সাথে অন্বেষণকে পছন্দ করেছেন ... যেহেতু আমি স্প্লাইনের একটি বড় অনুরাগী, এবং এটি আমার অন্তর্নিহিতের বিপরীতে যায় আমি এই যুক্তিগুলি কতটা বৈধ তা খুঁজে পেতে আগ্রহী এবং যদি অ্যান্টি-স্প্লাইন- এর একটি বৃহত গ্রুপ থাকে সেখানে কর্মীরা ?
পটভূমি : আমি যখন আমার মডেলগুলি তৈরি করি তখন ফ্র্যাঙ্ক হ্যারেল, রেগ্রেশন মডেলিং কৌশলগুলি (1) অনুসরণ করার চেষ্টা করি। তিনি যুক্তি দিয়েছিলেন যে নিয়মিত ঘন স্প্লাইজগুলি অবিচ্ছিন্ন ভেরিয়েবলগুলি অন্বেষণের জন্য একটি বৈধ সরঞ্জাম। তিনি আরও যুক্তি দিয়েছিলেন যে থ্রোসোল্ডস, লোগারিথমিক (২) এর মতো নির্দিষ্ট সম্পর্কের মডেলিংয়ে বহুভুজগুলি দুর্বল। মডেলের লিনিয়ারিটি পরীক্ষার জন্য তিনি স্প্লাইনের জন্য একটি আনোভা পরীক্ষার পরামর্শ দেন:
আমি স্প্লিংসের সাথে ওভার ফিট করার জন্য গুগল করেছি তবে খুব বেশি কার্যকর খুঁজে পেলাম না (খুব বেশি নট ব্যবহার না করার বিষয়ে সাধারণ সতর্কতা বাদে)। এই ফোরামে সেখানে স্প্লাইন মডেলিং, জন্য একটি পক্ষপাত আছে বলে মনে হয় Kolassa , Harrell , gung ।
পলিনোমিয়াল সম্পর্কে একটি ব্লগ পোস্ট পেয়েছি, অতিপরিচয়টির শয়তান যা বহুবচনগুলির পূর্বাভাস দেওয়ার বিষয়ে কথা বলে। পোস্টটি এই মন্তব্যগুলির সাথে শেষ হয়:
কিছু উপায়ে এখানে উপস্থাপিত উদাহরণগুলি প্রতারণা করছে - বহুবর্ষীয় রিগ্রেশন অত্যন্ত উচ্চ-শক্তিশালী হিসাবে পরিচিত। অনুশীলনে আরও ভাল হ'ল বহুত্বের পরিবর্তে স্প্লাইন ব্যবহার করা।
এখন এটি আমাকে উদাহরণগুলির সাথে কীভাবে স্প্লাইমগুলি সম্পাদন করবে তা পরীক্ষা করতে অনুরোধ করেছে:
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।
হালনাগাদ
মন্তব্যগুলি আমাকে বিস্মিত করেছিল যে ডেটা স্প্যানের মধ্যে কিন্তু অস্বস্তিকর কার্ভগুলির সাথে কী ঘটে। বেশিরভাগ পরিস্থিতিতে আমি তথ্য সীমার বাইরে যাচ্ছি না, যেমন উপরের উদাহরণটি সূচিত করে indicates আমি নিশ্চিত নই যে এটি পূর্বাভাস হিসাবে যোগ্যতা অর্জন করেছে ...
যাইহোক এখানে একটি উদাহরণ যেখানে আমি আরও জটিল লাইন তৈরি করি যা বহুবর্ষে অনুবাদ করা যায় না। যেহেতু বেশিরভাগ পর্যবেক্ষণগুলি ডেটার কেন্দ্রে থাকে আমি সেগুলিও অনুকরণ করার চেষ্টা করেছি:
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)
এটি নিম্নলিখিত প্লট দেয়:
আপডেট 2
যেহেতু এই পোস্টটি আমি একটি নিবন্ধ প্রকাশ করেছি যা একটি বড় ডেটাসেটে বয়সের জন্য অ-লিনিয়ারিটি দেখায়। পরিপূরকটি বিভিন্ন পদ্ধতির তুলনা করে এবং আমি এটি সম্পর্কে একটি ব্লগ পোস্ট লিখেছি ।