अंतरवर्ती परिणामों की व्याख्या करना


20

मैं आरएल का उपयोग करके GLM के लिए एक तंदुरुस्त करने की कोशिश कर रहा हूं। एक बार जब मैं तंदुरुस्त हो जाता हूं, तो मैं अपने परिणामी मॉडल को लेने और एक एक्सेल वर्कबुक में मॉडलिंग फ़ाइल बनाने में सक्षम होना चाहता हूं।

उदाहरण के लिए, मान लें कि मेरे पास एक डेटा सेट है जहां y x का एक यादृच्छिक कार्य है और ढलान अचानक एक विशिष्ट बिंदु पर बदलता है (इस मामले में @ 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" मान दिया गया है, उस नए x को उचित स्पलाइन फ़ंक्शन में प्लग करता है (या तो 500 से ऊपर मानों के लिए फ़ंक्शन या 500 से नीचे के मानों के लिए फ़ंक्शन), फिर यह उस परिणाम को ले जाता है और गुणा करता है यह उपयुक्त गुणांक से और उस बिंदु से इसे किसी अन्य मॉडल शब्द की तरह मानता है। मुझे ये स्पलाइन फ़ंक्शंस कैसे मिलेंगे?

(नोट: मुझे एहसास है कि लॉग-लिंक्ड गामा GLM प्रदान किए गए डेटा सेट के लिए उपयुक्त नहीं हो सकता है। मैं GLMs को कैसे या कब फिट करना है, इसके बारे में नहीं पूछ रहा हूं। मैं उस सेट को प्रतिलिपि प्रस्तुत करने योग्य प्रयोजनों के लिए एक उदाहरण के रूप में प्रदान कर रहा हूं।)


7
मेरा सुझाव है, यदि संभव हो तो, कोड को शामिल करने से बचने के लिए जो सभी चर ( rm(list=ls())) को हटा देता है , विशेष रूप से बिना किसी चेतावनी के। किसी सकता है अपने कोड आर का एक खुला सत्र में जहां वे पहले से ही कुछ चर (लेकिन कोई भी कहा जाता है कॉपी-पेस्ट x, y, dfया spline1) और याद आती है कि अपने कोड को अपने काम का सफाया। क्या उनके लिए ऐसा करना गूंगा है? हाँ। लेकिन यह अभी भी विनम्र है कि उन्हें निर्णय लेने दें कि कब अपने स्वयं के चर को हटाना है।
Glen_b -Reinstate मोनिका

जवाबों:


25

आप Rकोड में जाने के बिना स्पलाइन फॉर्मूले को रिवर्स-इंजीनियर कर सकते हैं । यह जानने के लिए पर्याप्त है

  • एक तख़्ता एक टुकड़े-टुकड़े बहुपद समारोह है।

  • डिग्री बहुपदों को उनके मानों द्वारा डी + 1 अंक पर निर्धारित किया जाता है।dd+1

  • एक बहुपद के गुणांक को रैखिक प्रतिगमन के माध्यम से प्राप्त किया जा सकता है।

d+1xxdd=34×4=16d+1=4x

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

Rxएक्स

एक्सेल स्निपेट


2
ns.formula.. क्या आप R में सोचते हैं ?! गंभीरता से हालांकि आपका तरीका बहुत उपयोगी है, लेकिन इन मापदंडों को प्राप्त करने के लिए हैक हैक करना विडंबना है। एक तालिका का उत्पादन करने के लिए बहुत उपयोगी होगा ..
geotheory

यह एक बेवकूफी भरा सवाल हो सकता है: लेकिन क्या यह 4 स्प्लिन है जो आप साजिश रच रहे हैं, या एक आधार का 4 आधार है?
इरोसिनिन

@ इरोसिनिन मैं इस बात पर निर्भर करता है कि आप "एक तख़्ती" से क्या मतलब रखते हैं। ये चार मोड़ एक अंतराल के लिए एक आधार है जो चार अंतरालों में टुकड़ा-टुकड़ा क्यूबिक है और तीन बिंदुओं पर लगातार दूसरा भिन्न होता है, जहां वे अंतराल मिलते हैं, जैसा कि तीन बुलेट बिंदुओं द्वारा वर्णित है जो मेरे उत्तर का परिचय देते हैं।
whuber

धन्यवाद! मेरा मतलब नाइटपैकिंग से नहीं था, यह सिर्फ ऐसा लगता है कि चार स्प्लिन हैं (उत्तर से), और चार वक्र नहीं हैं जो एक आधार हैं। फिर, मैं यहाँ सिर्फ समझने की कोशिश कर रहा हूँ ...
इरोसिन

1
@ इरोसिनिन कोई समस्या नहीं है। शायद यह मदद करेगा: "स्पलाइन" जो भी इन चार घटों के रैखिक संयोजन को प्रतिगमन फिटिंग प्रक्रिया द्वारा निर्धारित किया जाता है। इसे लगाने का एक और तरीका: स्पलाइन में वक्रों का एक सदिश स्थान होता है जिसे इन चार वक्रों के रैखिक संयोजनों को मिलाकर बनाया जा सकता है।
whuber

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

अब मैं आपको एक्स = 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 

आपकी प्रतिक्रिया के लिए धन्यवाद! लेकिन, मैं अभी भी उलझन में हूं: /। मुझे यकीन नहीं है कि मुझे पता है कि इस मैट्रिक्स के साथ क्या करना है। उदाहरण के लिए, अगर मेरे पास x = 12 था, तो भविष्यवाणी कहती है y = 68.78721, लेकिन उस मैट्रिक्स से 12 को देखने पर मुझे 0.016816392 मिलते हैं। X <500 के लिए मूल अवरोधन और गुणांक क्रमशः 4.174603 और 3.830416 है। exp (4.174603 + 3.8304116 * 0.016816392) <> 68.78721। साथ ही, अगर प्रशिक्षण सेट में x नहीं था, तो मुझे x के लिए मान कैसे मिलेगा?
एरिक

मैंने अपना जवाब बदल दिया।
स्टेट

मैंने उस मामले के लिए एक कोड जोड़ा जब x प्रशिक्षण सेट में नहीं था।
स्टेट

2
क्या भविष्यवाणी कार्य का उपयोग किए बिना x = 1100 के लिए 366.3483 प्राप्त करने का एक तरीका है?
एरिक

4

आर rmsपैकेज का उपयोग करके, क्यूबिक रिग्रेशन स्प्लिन के लिए छंटनी की शक्ति के आधार का उपयोग करना आपको आसान लग सकता है । एक बार जब आप मॉडल फिट कर लेते हैं तो आप फिट किए गए स्पलाइन फ़ंक्शन के बीजगणितीय प्रतिनिधित्व को पुनः प्राप्त कर सकते हैं Functionया latexइन कार्यों का उपयोग कर सकते हैं rms


धन्यवाद। मैं वास्तव में पोस्ट करने से पहले आपकी प्रतिक्रिया यहां पढ़ता हूंआँकड़े।स्टैकएक्सचेंज . com/questions/67607/… । मुझे लगता है कि मैं सिर्फ एक बेहतर समझ की जरूरत है कि मैं rms के साथ क्या कर सकता हूं।
एरिक

इसके लिए प्रलेखन Function()वास्तव में यह नहीं कहता है कि यह क्या करता है। मेरे मामले में (Rpubs rpubs.com/EmilOWK/rms_splines पर विवरण देखें ), मुझे लगता है 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.7787मूल्य मॉडल में पहला गुण है, 245.72672दूसरा, और अंतिम गुण -873.0223समीकरण में कहीं भी नहीं देखा जाता है। के आउटपुट पर भी यही बात लागू होती है latex()
डिले

FunctionGlm()जब आप rcsस्पलाइन फ़ंक्शन के रूप में उपयोग करते हैं तो काम करता है । आउटपुट रीप्लेसिंग को सरलतम रूप में लिखकर बता रहा है जैसे कि मेरे RMS कोर्स नोट्स में लीनियर टेल प्रतिबंध नहीं हैं (लेकिन वे हैं) ।
फ्रैंक हरेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.