एक टुकड़ा रेखीय समारोह से डेटा में परिवर्तन बिंदु ढूँढना


10

अभिवादन,

मैं अनुसंधान कर रहा हूं जो कि मनाया गया स्थान और बड़े धमाके के बाद बीता हुआ समय निर्धारित करने में मदद करेगा। उम्मीद है कि आप मदद कर सकते हैं!

मेरे पास एक टुकड़े-टुकड़े रैखिक फ़ंक्शन के अनुरूप डेटा है, जिस पर मैं दो रैखिक रेजिमेंट करना चाहता हूं। एक बिंदु है जिस पर ढलान और अवरोधन बदलते हैं, और मुझे इस बिंदु को खोजने के लिए (एक कार्यक्रम लिखना) की आवश्यकता है।

विचार?


3
क्रॉस-पोस्टिंग पर क्या नीति है? Math.stackexchange.com: math.stackexchange.com/questions/15214/…
mpiktas

इस मामले में सरल गैर-रैखिक कम से कम वर्गों को करने में क्या गलत है? क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?
ग्रग s

मैं कहता हूं कि परिवर्तन बिंदु पैरामीटर के संबंध में लक्ष्य फ़ंक्शन का व्युत्पन्न, बल्कि सुचारू है
आंद्रे होल्ज़नर

ढलान इतना बदल जाएगा कि एक गैर-रैखिक न्यूनतम वर्ग संक्षिप्त और सटीक नहीं होगा। हम जानते हैं कि हमारे पास दो या अधिक रैखिक मॉडल हैं, इसलिए हमें उन दो मॉडलों को निकालने के लिए हड़ताल करनी चाहिए।
हैलो वर्ल्ड

जवाबों:


1

mcpपैकेज कर सकते हैं। कहो आपका डेटा है

सबसे पहले, आइए कुछ डेटा का अनुकरण करें:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

अब देखते हैं कि क्या हम 40 (और पैरामीटर मान) का उपयोग करके परिवर्तन बिंदु को पुनर्प्राप्त कर सकते हैं mcp:

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

इसे प्लॉट करें। ग्रे लाइनें फिट से यादृच्छिक ड्रॉ हैं, यह दिखाती है कि यह प्रवृत्ति को पकड़ती है। नीला वक्र अनुमानित परिवर्तन बिंदु स्थान है:

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

आइए व्यक्तिगत पैरामीटर अनुमान देखें। int_इंटरसेप्ट हैं, x_x पर ढलान हैं, और cp_परिवर्तन बिंदु हैं:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

डिस्क्लेमर: मैं इसका डेवलपर हूं mcp


8

आर पैकेज स्ट्रैचेंज आपकी मदद कर सकता है। विगनेट पर देखें, यह एक अच्छा अवलोकन है कि इसी तरह की समस्याओं को कैसे हल किया जाए।


6

यदि अंकों की संख्या बहुत बड़ी नहीं है, तो आप सभी संभावनाओं को आजमा सकते हैं। मान लेते हैं कि बिंदु हैंएक्समैं=(एक्समैं,yमैं) कहाँ पे मैं=1,,एन। थान, आप के साथ लूप कर सकते हैंजे से 2 सेवा एन-2 और दोनों को दो लाइनें फिट करें {एक्स1,,एक्सजे} तथा {एक्स(जे+1),,एक्सएन}। अंत में, आप चुनेंजे जिसके लिए दोनों लाइनों के लिए वर्गीय अवशिष्टों का योग न्यूनतम है।


मैंने आपके सरल लेकिन प्रभावी सुझाव के आधार पर उत्तर पोस्ट किया है।
नमस्ते

5

यह (ऑफलाइन) चेंजपॉइंट डिटेक्शन की समस्या है। हमारी पिछली चर्चा जर्नल लेखों और आर कोड के संदर्भ प्रदान करती है। पहली बार में देखो बैरी और हार्टिगन "उत्पाद विभाजन के मॉडल," क्योंकि यह ढलान में परिवर्तन संभालती है और कुशल कार्यान्वयन है।


3

इसके अलावा खंडित पैकेज ने मुझे अतीत में इसी तरह की समस्याओं के साथ मदद की है।


दुर्भाग्य से, पैकेज को ब्रेक-पॉइंट के लिए शुरुआती मूल्य की आवश्यकता होती है।
हैलोवर्ल्ड

इसके अलावा, segmentedखंडों के बीच अवरोधन-परिवर्तन को मॉडल नहीं कर सकते - केवल पहले खंड के लिए एक अवरोधन।
जोनास लिंडेलोव

2

मैंने mbq के उत्तर पर निर्माण किया जो सभी संभावनाओं को खोज रहा था। इसके अलावा, मैं यह करता हूं:

  • गुणांक महत्वपूर्ण हैं यह सुनिश्चित करने के लिए दो टुकड़ा मॉडल के महत्व के लिए जाँच करें
  • पूर्ण मॉडल के लिए चुकता अवशिष्ट के योग के अंतर की जाँच करें
  • मेरे मॉडल की पुष्टि करें (सुनिश्चित करें कि यह कुछ बकवास नहीं है)

क्यों महत्व की जाँच करें? ऐसा इसलिए है क्योंकि न्यूनतम एसएसई के साथ बिंदु व्यर्थ है यदि दोनों में से कोई भी टुकड़ा-टुकड़ा मॉडल डेटा को बहुत खराब तरीके से फिट करता है। यह स्पष्ट ब्रेकपॉइंट के बिना दो अत्यधिक सहसंबद्ध चर के लिए हो सकता है जहां ढलान बदलते हैं।

आइए इस सरल दृष्टिकोण को एक आसान परीक्षण के मामले में देखें:

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

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

ब्रेकपॉइंट स्पष्ट रूप से शून्य है। निम्नलिखित आर स्क्रिप्ट का उपयोग करें:

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

सभी संभावित संयोजनों के लिए उपयुक्त टुकड़े-टुकड़े रैखिक मॉडल:

f(x,y)
   k sums
   0    0

यदि हम दो इष्टतम मॉडल के लिए गुणांक की जांच करते हैं, तो वे अत्यधिक महत्वपूर्ण होंगे। उनकी R2 भी बहुत अधिक होगी।

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