স্প্লাইন ফলাফল ব্যাখ্যা করা


20

আমি আরএল ব্যবহার করে একটি জিএলএমের জন্য একটি স্প্লাইন ফিট করার চেষ্টা করছি Once

উদাহরণস্বরূপ, ধরা যাক যে আমার কাছে একটি ডেটা সেট রয়েছে যেখানে y এক্স এর র্যান্ডম ফাংশন এবং pointালটি হঠাৎ করে একটি নির্দিষ্ট পয়েন্টে পরিবর্তিত হয় (এই ক্ষেত্রে @ x = 500)।

set.seed(1066)
x<- 1:1000
y<- rep(0,1000)

y[1:500]<- pmax(x[1:500]+(runif(500)-.5)*67*500/pmax(x[1:500],100),0.01)
y[501:1000]<-500+x[501:1000]^1.05*(runif(500)-.5)/7.5

df<-as.data.frame(cbind(x,y))

plot(df)

আমি এখন এটি ব্যবহার করে ফিট করি

library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))

এবং আমার ফলাফল প্রদর্শন

summary(spline1)

Call:
glm(formula = y ~ ns(x, knots = c(500)), family = Gamma(link = "log"), 
    data = df)

Deviance Residuals: 
     Min       1Q   Median       3Q      Max  
-4.0849  -0.1124  -0.0111   0.0988   1.1346  

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)             4.17460    0.02994  139.43   <2e-16 ***
ns(x, knots = c(500))1  3.83042    0.06700   57.17   <2e-16 ***
ns(x, knots = c(500))2  0.71388    0.03644   19.59   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for Gamma family taken to be 0.1108924)

    Null deviance: 916.12  on 999  degrees of freedom
Residual deviance: 621.29  on 997  degrees of freedom
AIC: 13423

Number of Fisher Scoring iterations: 9

এই মুহুর্তে, আমি r এর মধ্যে পূর্বাভাস ফাংশনটি ব্যবহার করতে পারি এবং পুরোপুরি গ্রহণযোগ্য উত্তর পেতে পারি। সমস্যাটি হ'ল আমি এক্সেলের একটি ওয়ার্কবুক তৈরি করতে মডেল ফলাফলগুলি ব্যবহার করতে চাই।

পূর্বাভাস ফাংশন সম্পর্কে আমার বোঝা হল যে একটি নতুন "x" মান দেওয়া হয়েছে, আর সেই নতুন এক্সটিকে যথাযথ স্প্লাইন ফাংশনে (500 টিরও বেশি মানের জন্য ফাংশন বা 500 এর নীচের মানের জন্য একটি) প্লাগ করে, তারপরে এটি ফলাফল নেয় এবং বহুগুণ হয় এটি যথাযথ সহগ দ্বারা এবং সেদিক থেকে এটি অন্য কোনও মডেল শর্তাদির মতো আচরণ করে। আমি এই স্প্লাইন কার্যগুলি কীভাবে পেতে পারি?

(দ্রষ্টব্য: আমি বুঝতে পেরেছি যে লগ-লিঙ্কযুক্ত গামা জিএলএম সরবরাহিত ডেটা সেটের জন্য উপযুক্ত নাও হতে পারে G আমি কীভাবে বা কখন জিএলএম ফিট করব সে বিষয়ে জিজ্ঞাসা করছি না I আমি সেই সেটটি পুনরুত্পাদনযোগ্যতার উদ্দেশ্যে উদাহরণ হিসাবে সরবরাহ করছি))


7
আমি প্রস্তাব দিই, যদি সম্ভব হয় তবে সমস্ত কোডটি ( rm(list=ls())) মুছে ফেলা এমন কোড সহ এড়াতে বিশেষত কোনও সতর্কতা ছাড়াই নয়। কেউ পারে আপনার কোড আর একটি খোলা সেশন যেখানে তারা ইতিমধ্যে কিছু ভেরিয়েবল (কিন্তু কেউই নামের কপি-পেস্ট করুন x, y, dfবা spline1) এবং মিস যে আপনার কোড তাদের কাজ মিটিয়ে দেন। তাদের পক্ষে কি করুণা বোবা? হ্যাঁ. তবে তাদের নিজস্ব ভেরিয়েবলগুলি কখন মুছবেন তা তাদের সিদ্ধান্ত নিতে এখনও ভদ্র।
গ্লেন_বি -রিনস্টেট মনিকা

উত্তর:


25

আপনি Rকোডে না গিয়ে স্প্লাইন সূত্রগুলি রিভার্স-ইঞ্জিনিয়ার করতে পারেন । এটা জানার পক্ষে যথেষ্ট

  • একটি স্প্লাইন হ'ল টুকরোচক বহু বহুবিধ কার্য।

  • + +1

  • বহুবর্ষের সহগগুলি লিনিয়ার রিগ্রেশনের মাধ্যমে প্রাপ্ত হতে পারে।

+ +1এক্সএক্স=34×4=16+ +1=4এক্স

64RR

এই পদ্ধতিটি কোনও পরিসংখ্যান সংক্রান্ত সফ্টওয়্যার, এমনকি অনিবন্ধিত মালিকানাধীন সফ্টওয়্যার, যার উত্স কোড অনুপলব্ধ রয়েছে সাথে কাজ করবে।

200,500,800(1,1000)RR এক্সেলের ডিফল্ট রঙগুলি প্রায় মেলাতে )।

প্লট

এক্সেল প্লট

( 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

প্রথম স্প্লাইন আউটপুট সূত্র (এখানে উত্পাদিত চারটির মধ্যে)

"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)"

Rএক্সএক্স

এক্সেল স্নিপেট


2
ns.formula.. আপনি কি আর মনে করেন ?! সিরিয়াসলি যদিও আপনার পদ্ধতিটি খুব দরকারী মনে হচ্ছে তবে এই পরামিতিগুলি পেতে হ্যাক করতে হবে এমনটি বিদ্রূপজনক বলে মনে হচ্ছে। একটি টেবিল আউটপুট করতে খুব দরকারী হবে ..
ভূতত্ত্ব

এটি একটি মূ ?় প্রশ্ন হতে পারে: তবে এটি কি 4 টি স্প্লিনগুলি আপনি ষড়যন্ত্র করছেন বা একটি স্প্লিনের 4 ভিত্তি?
ইরোজেনিন

@ ইরোসেনেনিন আপনি "একটি স্প্লাইন" দ্বারা আপনি কী বোঝাতে চাইছেন তার উপরে আমি নির্ভর করি। এই চারটি বক্ররেখা এমন একটি স্প্লিনের ভিত্তি যা চার বিরতিতে টুকরোচক ঘন এবং সেই উত্তর অন্তরগুলি যে তিনটি পয়েন্টগুলিতে মিলিত হয় সেখানে ক্রমাগতভাবে দ্বিতীয় পার্থক্যযুক্ত, আমার উত্তর প্রবর্তনকারী তিনটি বুলেট পয়েন্ট দ্বারা বর্ণিত।
শুশুক

ধন্যবাদ! আমি নিটপিকিং করা বোঝাতে চাইনি, এটি দেখতে কেবল চারটি স্প্লিন (উত্তর থেকে), এবং চারটি বক্ররেখা নয় যা একটি ভিত্তি। আবার, আমি এখানেই বোঝার চেষ্টা করছি ...
এরোসেনিন

1
@ ইরোসেনেনি কোন সমস্যা নেই সম্ভবত এটি সহায়তা করবে: এই চারটি কার্ভের লিনিয়ার সংমিশ্রণটি রিগ্রেশন ফিটিং প্রক্রিয়া দ্বারা নির্ধারিত হয় "স্প্লাইন"। এটি রাখার আরেকটি উপায়: স্প্লাইনটি বক্ররেখকের একটি ভেক্টর স্পেস নিয়ে গঠিত যা এই চারটি বাঁকের লিনিয়ার সংমিশ্রণগুলি তৈরি করে তৈরি করা যেতে পারে।
হোয়াট

4

আপনি ইতিমধ্যে নিম্নলিখিতগুলি করেছেন:

> rm(list=ls())
> set.seed(1066)
> x<- 1:1000
> y<- rep(0,1000)
> y[1:500]<- pmax(x[1:500]+(runif(500)-.5)*67*500/pmax(x[1:500],100),0.01)
> y[501:1000]<-500+x[501:1000]^1.05*(runif(500)-.5)/7.5
> df<-as.data.frame(cbind(x,y))
> library(splines)
> spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
> 

এখন আমি আপনাকে কীভাবে x = 12 এর জন্য দুটি ভিন্ন উপায়ে (প্রতিক্রিয়া) পূর্বাভাস দিতে হবে তা দেখাব: প্রথমে পূর্বাভাস ফাংশনটি ব্যবহার করুন (সহজ উপায়!)

> new.dat=data.frame(x=12)
> predict(spline1,new.dat,type="response")
       1 
68.78721 

২ য় উপায় সরাসরি মডেল ম্যাট্রিক্সের উপর ভিত্তি করে। নোট আমি expযেহেতু ব্যবহৃত লিঙ্ক ফাংশন লগ হয় তাই ব্যবহার করেছি।

> m=model.matrix( ~ ns(df$x,knots=c(500))) 
> prd=exp(coefficients(spline1) %*% t(m)) 
> prd[12]
[1] 68.78721

নোট করুন যে উপরে আমি 12 তম উপাদানটি বের করেছি, যেহেতু এটি x = 12 এর সাথে সম্পর্কিত। আপনি যদি প্রশিক্ষণের সেটের বাইরে কোনও এক্সের জন্য ভবিষ্যদ্বাণী করতে চান, তবে কেবল আপনি আবার পূর্বাভাস ফাংশনটি ব্যবহার করতে পারেন। বলুন আমরা x = 1100 এর পূর্বে পূর্বাভাস দেওয়া প্রতিক্রিয়ার মানটি খুঁজতে চাই

> predict(spline1, newdata=data.frame(x=1100),type="response")
       1 
366.3483 

আপনার প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ! তবে, আমি এখনও বিভ্রান্ত: /। আমি নিশ্চিত নই যে এই ম্যাট্রিক্সের সাথে আমি কী করব know উদাহরণস্বরূপ, আমার কাছে x = 12 থাকলে পূর্বাভাসটি y = 68.78721 বলে, তবে সেই ম্যাট্রিক্স থেকে 12 খুঁজে পেয়ে আমি 0.016816392 পেয়েছি। X <500 এর জন্য মূল ইন্টারসেপ্ট এবং সহগ যথাক্রমে 4.174603 এবং 3.830416। এক্সপ্রেস (4.174603 + 3.8304116 * 0.016816392) <> 68.78721। অধিকন্তু, এক্স যদি প্রশিক্ষণের সেটটিতে না থাকে তবে আমি কীভাবে এক্স এর মান পাব?
এরিক

আমি আমার উত্তর পরিবর্তন করেছি।
স্টেট

এক্স ট্রেনিং সেটে যখন ছিল না তখন আমি মামলার জন্য একটি কোড যুক্ত করেছি।
স্টেট

2
পূর্বাভাস ফাংশনটি ব্যবহার না করে x = 1100 এর জন্য 366.3483 পাওয়ার উপায় আছে কি?
এরিক

4

আর rmsপ্যাকেজটি ব্যবহার করে আপনি কিউবিক রিগ্রেশন স্প্লাইনের জন্য ছাঁটাই হওয়া পাওয়ার ভিত্তিটি আরও সহজ ব্যবহার করতে পারেন । একবার আপনি মডেলটি ফিট করলে আপনি ইন Functionবা latexফাংশনগুলি ব্যবহার করে লাগানো স্প্লাইন ফাংশনের বীজগণিত উপস্থাপনাটি পুনরুদ্ধার করতে পারেন rms


ধন্যবাদ. পোস্ট করার আগে আমি এখানে আসলে আপনার প্রতিক্রিয়াটি স্ট্যাটাস.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস / 67607/… পড়েছি read আমি অনুমান করি যে আমি আরএমএস দিয়ে কী করতে পারি তার একটি আরও ভাল উপলব্ধি আমার দরকার।
এরিক

এর জন্য দস্তাবেজগুলি Function()এটি কী করে তা সত্যিই বলে না। আমার ক্ষেত্রে (চালু Rpubs বিস্তারিত দেখুন rpubs.com/EmilOWK/rms_splines ), আমি পেতে মান মডেল, প্রথম coef হয় , দ্বিতীয় ও শেষ coef সমীকরণ যে কোন জায়গায় নেই দেখা হয়। একই আউটপুট প্রযোজ্য । function(x = NA) {-2863.7787+245.72672* x-0.1391794*pmax(x-10.9,0)^3+0.27835881*pmax(x-50.5,0)^3-0.1391794*pmax(x-90.1,0)^3 } <environment: 0x556156e80db8>-2863.7787245.72672-873.0223latex()
ডিলিট

FunctionGlm()আপনি rcsস্প্লাইন ফাংশন হিসাবে ব্যবহার করার সাথে কাজ করে। আউটপুটটি সরল আকারে স্প্লাইনটিকে পুনরায় লিখছে যাতে আমার আরএমএস কোর্স নোটগুলিতে বর্ণিত লিনিয়ার টেইল সীমাবদ্ধতা নেই (তবে সেগুলি রয়েছে) ।
ফ্র্যাঙ্ক হ্যারেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.