डेटा को कैसे सुचारू करें और एकरसता को बल दें


14

मेरे पास कुछ आंकड़े हैं, जिन्हें मैं चिकना करना चाहूंगा ताकि स्मूद पॉइंट्स मोनोटोनिक रूप से कम हो जाएं। मेरा डेटा तेजी से घटता है और फिर पठार के लिए शुरू होता है। यहाँ R का उपयोग करके एक उदाहरण दिया गया है

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()

plot of data to smooth

मैं एक अच्छी स्मूथिंग तकनीक क्या उपयोग कर सकता हूं? इसके अलावा, यह अच्छा होगा अगर मैं पहली बार स्मूद पॉइंट को अपने अवलोकन बिंदु के करीब होने के लिए मजबूर कर सकता हूं।


1
मैंने देखा कि आपके उदाहरण मान पूर्णांक हैं। क्या आपके वास्तविक मूल्य मायने रखते हैं? यदि वे थे, तो (जबकि यह एकरसता की कोई गारंटी नहीं है, इस तरह के डेटा के लिए यह आम तौर पर इसे वैसे भी देगा), कुछ इस तरह उपयोगी हो सकता है:plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Glen_b -Reinstate Monica

इसी तरह के क्यू उत्तर के साथ: आंकड़े.stackexchange.com/questions/206073/…
kjetil b halvorsen

जवाबों:


18

आप mgcv पैकेज में mono.con()और pcls()फ़ंक्शंस के माध्यम से मोनोटोनिकिटी की कमी के साथ दंडित विभाजन का उपयोग करके ऐसा कर सकते हैं । इन कार्यों को उपयोगकर्ता के अनुकूल नहीं होने के कारण थोड़ा सा फ़िदा होना पड़ता है gam(), लेकिन ?pclsआपके द्वारा दिए गए नमूना डेटा के अनुरूप संशोधित किए गए चरणों को अधिकतर उदाहरण के आधार पर नीचे दिखाया गया है :

df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))

## Set up the size of the basis functions/number of knots
k <- 5
## This fits the unconstrained model but gets us smoothness parameters that
## that we will need later
unc <- gam(y ~ s(x, k = k, bs = "cr"), data = df)

## This creates the cubic spline basis functions of `x`
## It returns an object containing the penalty matrix for the spline
## among other things; see ?smooth.construct for description of each
## element in the returned object
sm <- smoothCon(s(x, k = k, bs = "cr"), df, knots = NULL)[[1]]

## This gets the constraint matrix and constraint vector that imposes
## linear constraints to enforce montonicity on a cubic regression spline
## the key thing you need to change is `up`.
## `up = TRUE` == increasing function
## `up = FALSE` == decreasing function (as per your example)
## `xp` is a vector of knot locations that we get back from smoothCon
F <- mono.con(sm$xp, up = FALSE)   # get constraints: up = FALSE == Decreasing constraint!

अब हमें उस ऑब्जेक्ट को भरने की आवश्यकता है जो pcls()उस दंडित विवश मॉडल के विवरणों को पास करता है जिसे हम फिट करना चाहते हैं

## Fill in G, the object pcsl needs to fit; this is just what `pcls` says it needs:
## X is the model matrix (of the basis functions)
## C is the identifiability constraints - no constraints needed here
##   for the single smooth
## sp are the smoothness parameters from the unconstrained GAM
## p/xp are the knot locations again, but negated for a decreasing function
## y is the response data
## w are weights and this is fancy code for a vector of 1s of length(y)
G <- list(X = sm$X, C = matrix(0,0,0), sp = unc$sp,
          p = -sm$xp, # note the - here! This is for decreasing fits!
      y = df$y,
          w = df$y*0+1)
G$Ain <- F$A    # the monotonicity constraint matrix
G$bin <- F$b    # the monotonicity constraint vector, both from mono.con
G$S <- sm$S     # the penalty matrix for the cubic spline
G$off <- 0      # location of offsets in the penalty matrix

अब हम अंत में फिटिंग कर सकते हैं

## Do the constrained fit 
p <- pcls(G)  # fit spline (using s.p. from unconstrained fit)

pतख़्ता के अनुरूप आधार कार्यों के लिए गुणांक का एक वेक्टर होता है। फिट की गई कल्पना को देखने के लिए, हम x की सीमा पर 100 स्थानों पर मॉडल से भविष्यवाणी कर सकते हैं। प्लॉट पर एक अच्छी चिकनी रेखा पाने के लिए हम 100 मान करते हैं।

## predict at 100 locations over range of x - get a smooth line on the plot
newx <- with(df, data.frame(x = seq(min(x), max(x), length = 100)))

हमारे द्वारा उपयोग किए जाने वाले अनुमानित मूल्यों को उत्पन्न करने के लिए Predict.matrix(), जो एक मैट्रिक्स को उत्पन्न करता है, ताकि जब गुणांक द्वारा एकाधिक pफिट किए गए मूल्यों से पैदावार का अनुमान लगाता है:

fv <- Predict.matrix(sm, newx) %*% p
newx <- transform(newx, yhat = fv[,1])

plot(y ~ x, data = df, pch = 16)
lines(yhat ~ x, data = newx, col = "red")

यह उत्पादन करता है:

यहाँ छवि विवरण दर्ज करें

मैं इसे आप तक छोड़ दूंगा कि ggplot के साथ साजिश रचने के लिए डेटा को एक स्पष्ट रूप में प्राप्त करें ...

आधार फ़ंक्शन के आयाम को बढ़ाकर आप एक करीबी फिट (पहले डेटा पॉइंट को स्मूथली फिट होने के बारे में आंशिक रूप से अपने प्रश्न का उत्तर देने के लिए) बाध्य कर सकते हैं x। उदाहरण के लिए, ( ) के kबराबर सेट करना और ऊपर दिए गए कोड को फिर से देखना8k <- 8

यहाँ छवि विवरण दर्ज करें

आप kइन आंकड़ों के लिए बहुत अधिक धक्का नहीं दे सकते हैं , और आपको अधिक फिटिंग के बारे में सावधान रहना होगा; सभी pcls()कर रहा है दंडित कम से कम वर्गों की समस्या को हल करने के लिए बाधाओं और आपूर्ति आधार कार्यों को हल कर रहा है, यह आपके लिए चिकनाई चयन नहीं कर रहा है - ऐसा नहीं है कि मुझे पता है ...)

यदि आप प्रक्षेप चाहते हैं, तो बेस आर फ़ंक्शन देखें, ?splinefunजिसमें हर्माइट स्प्लीन और क्यूबिक स्प्लिन मोनोटोनॉक्टिक बाधाओं के साथ हैं। इस मामले में आप इसका उपयोग नहीं कर सकते, क्योंकि डेटा कड़ाई से मोनोटोनिक नहीं हैं।


धन्यवाद। मुझे यकीन है कि आपका समाधान एक उपयुक्त है, लेकिन यह इतना जटिल और अस्पष्ट है कि मैं इसका उपयोग नहीं कर सकता। splinefunथा मेरी प्रारंभिक विचार के रूप में अच्छी तरह से (मैं interpolating हूँ), लेकिन spline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")और spline(x=df$x, y=df$y, n=nrow(df), method="hyman")दोनों उठाने त्रुटियों
बेन

1
यदि आप अभी प्रयास करते हैं, तो मुझे यकीन है कि आप इसका उपयोग कर सकते हैं; मुझे इस बात का बहुत कम पता है कि यहां क्या हो रहा है, लेकिन मैंने इसे पूरा किया है, और मैंने उन जगहों को इंगित किया है जिन्हें आपको चीजों को बदलने की आवश्यकता होगी। आप कुछ आर के पाठ्यक्रम को जानते हैं । अधिकांश विवरण कार्यान्वयन योग्य है जिसे आप अनदेखा कर सकते हैं यदि आप इसे करना चाहते हैं, तो यह एक नीरस विवशता के अनुकूल है। क्या आप मुझे पसंद करेंगे कि प्रत्येक कदम के बारे में अधिक जानने के लिए कोड को थोड़ा और एनोटेट करें? संदर्भ में ?mono.conविधि के बारे में और विस्तार है।
मोनिका को बहाल करें - जी। सिम्पसन

क्यों splinefunएक त्रुटि बढ़ा रहा है; मुझे बस एहसास हुआ है, आप एक मोनोटोनिक तख़्ता फिट कर सकते हैं जो डेटा को प्रक्षेपित करता है जो स्वयं मोनोटोनिक नहीं है। पर अवलोकन x = 6अधिक से अधिक है yकि टिप्पणियों पर x = 5। आपको बस उत्तर के उस भाग को अनदेखा करना होगा :-)
मोनिका - जी। सिम्पसन

समझ गया। और कोई ज़रूरत नहीं है - मैं एक बहुत अनुभवी आर उपयोगकर्ता हूं। मैं सिर्फ उस गणित को समझना पसंद करता हूं जो मैं उपयोग करता हूं और यह समाधान प्रतीत होता है कि हुड के तहत काफी कुछ चल रहा है। आपकी सहायता के लिए एक बार फिर से धन्यवाद।
बेन

मैंने यह बताने के लिए कुछ नोट्स जोड़े हैं कि प्रत्येक चीज़ क्या है या क्या करती है; ध्यान देने की मुख्य बात यह है कि एक असमानता बाधाओं का एक विशिष्ट सेट जो mono.conएक घन रेखा के लिए लौटता है, एकरसता की बाधाएं हैं । ?pclsपतली प्लेट स्प्लिन और एडिटिव मॉडल के लिए उदाहरण हैं जो ऊपर से कम उपयोगकर्ता के अनुकूल हैं, लेकिन जो गणित के कुछ और तरीकों को उजागर कर सकते हैं यदि आप उन प्रकार के तख़्त के लिए गणित से परिचित हैं (मैं खुद परिचित नहीं हूं)।
मोनिका को बहाल करें - जी। सिम्पसन

13

हाल ही में नताल्या प्या द्वारा किया गया घोटाला पैकेज और प्या व वुड (2015) द्वारा "शेप कांस्ट्रेस्ड एडिटिव मॉडल" पेपर पर आधारित गैविन के उत्कृष्ट उत्तर में उल्लिखित प्रक्रिया का हिस्सा बहुत आसान बना सकता है।

library(scam)
con <- scam(y ~ s(x, k = k, bs = "mpd"), data = df)
plot(con)

आपके द्वारा उपयोग किए जा सकने वाले कई bs फ़ंक्शंस हैं - ऊपर मैंने "मोनोटोनिक घटते हुए P-spline" के लिए mpd का उपयोग किया था, लेकिन इसमें ऐसे फ़ंक्शंस भी हैं जो शंकुवृद्धि या संगति को अलग से लागू करते हैं या मोनोटोनिक बाधाओं के साथ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.