शून्य डेटा वाले इनपुट डेटा में वीबुल वितरण कैसे फिट करें?


14

मैं एक मौजूदा भविष्यवाणी एल्गोरिथ्म को पुन: पेश करने की कोशिश कर रहा हूं, जो एक सेवानिवृत्त शोधकर्ता द्वारा दिया गया है। पहला कदम एक वीबुल वितरण के लिए कुछ अवलोकन किए गए डेटा को फिट करना है, एक आकार और पैमाने प्राप्त करना है जो भविष्य के मूल्यों की भविष्यवाणी के लिए उपयोग किया जाएगा। मैं ऐसा करने के लिए R का उपयोग कर रहा हूं। यहाँ मेरे कोड का एक उदाहरण है:

x<-c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,51,77,78,144,34,29,45,16,15,37,218,170,44,121)
f<-fitdistr(x, 'weibull')

यह तब तक ठीक काम करता है जब तक कि इनपुट ऐरे में कोई शून्य न हो, जिसके कारण यह पूरी तरह से विफल हो जाता है। एसएएस में भी यही बात होती है। जैसा कि मैं इसे समझता हूं, यह इसलिए है क्योंकि वीबुल वितरण की गणना में एक कदम प्राकृतिक लॉग ले रहा है, जो 0. के लिए अपरिभाषित है। क्या इसके आसपास काम करने का एक उचित तरीका है?

मैंने अब तक जो सबसे अच्छा पाया है, वह है मेरे सभी इनपुट वैल्यू में 1 जोड़ना, कर्व को फिट करना, और फिर मेरे प्रिवेटेड वैल्यूज़ में से एक को घटाना (कर्व को ऊपर और फिर नीचे से 1 को बदलना)। यह पहले से अनुमानित डेटा को काफी अच्छी तरह से फिट करता है, लेकिन ऐसा लगता है कि ऐसा करने का एक गलत तरीका होना चाहिए।

संपादित करें: इनपुट ऐरे में मान देखे जाते हैं, वास्तविक-विश्व डेटा (कुछ होने की संख्या) कुछ वर्षों के लिए। इसलिए कुछ वर्षों में घटनाओं की संख्या शून्य थी। यह सबसे अच्छा तरीका है या नहीं (मैं सहमत हूं कि यह नहीं हो सकता है), मूल एल्गोरिथ्म लेखक का दावा है कि वेइबुल वितरण का उपयोग किया है, और मुझे उनकी प्रक्रिया को दोहराने की कोशिश करनी होगी।


5
वेइबुल एक निरंतर वितरण है जिससे कि बिल्कुल शून्य होने की संभावना की संभावना शून्य है। यदि आप अपने डेटा में कई शून्य प्राप्त कर रहे हैं, तो यह एक तात्कालिक संकेत है कि वेइबुल अनुचित है। किसी भी दर पर, आपका डेटा गणना डेटा की तरह दिखता है (या कम से कम, असतत है) और इसलिए एक वीबुल शायद सबसे अच्छा विकल्प नहीं है।
कार्डिनल

कुछ संदर्भों को जोड़ना जहां से डेटा आया था, किसी को भी जबरदस्त उत्तर देने की कोशिश करने में मदद करेगा।
कार्डिनल

जवाबों:


8

(जैसा कि अन्य ने बताया है, जब डेटा केवल पूर्णांक होता है, तो एक वीबुल वितरण एक उपयुक्त सन्निकटन होने की संभावना नहीं है। निम्नलिखित का उद्देश्य केवल यह निर्धारित करने में आपकी सहायता करना है कि पिछले शोधकर्ता ने क्या किया, सही या गलत तरीके से।)

कई वैकल्पिक विधियां हैं जो डेटा में शून्य से प्रभावित नहीं हैं, जैसे कि विभिन्न विधि-क्षण क्षणकों का उपयोग करना। इन्हें आमतौर पर गामा फ़ंक्शन से जुड़े समीकरणों के संख्यात्मक समाधान की आवश्यकता होती है, क्योंकि इस समारोह के संदर्भ में वीबुल वितरण के क्षण दिए गए हैं। मैं R से परिचित नहीं हूँ, लेकिन यहाँ एक ऋषि कार्यक्रम है जो सरल तरीकों में से एक को दिखाता है - शायद इसे R के अनुकूल बनाया जा सकता है? (आप इस और इस तरह के अन्य तरीकों के बारे में पढ़ सकते हैं, उदाहरण के लिए, हॉर्स्टेन, पी। 455ff द्वारा "द वीबुल डिस्ट्रीब्यूशन: ए हैंडबुक" , हालांकि, उनके eq.12.4b में एक टाइपो है, जैसा कि '-1' बेमानी है)।

"""
Blischke-Scheuer method-of-moments estimation of (a,b)
for the Weibull distribution F(t) = 1 - exp(-(t/a)^b)
""" 

x = [23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,16,15,37,218,170,44,121]
xbar = mean(x)
varx = variance(x)
var("b"); f(b) = gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2
bhat = find_root(f, 0.01, 100)
ahat = xbar/gamma(1+1/bhat)
print "Estimates: (ahat, bhat) = ", (ahat, bhat)

इससे उत्पादन हुआ

Estimates: (ahat, bhat) =  (81.316784310814455, 1.3811394719075942)


यदि उपरोक्त डेटा को ) द्वारा तीन सबसे छोटे मानों को बदलकर (केवल चित्रण के लिए) संशोधित किया गया है0

x = [23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121]

फिर वही प्रक्रिया आउटपुट का उत्पादन करती है

Estimates: (ahat, bhat) =  (78.479354097488923, 1.2938352346035282)


संपादित करें: मैंने इसे स्थापित करने का प्रयास करने के लिए आर स्थापित किया। इस उत्तर को लंबे समय तक बनाए रखने के जोखिम में, यहाँ किसी के लिए भी मेरा R-कोड ब्लिशके-स्च्यूअर विधि के लिए है:

fit_weibull <- function(x)
{
    xbar <- mean(x)
    varx <- var(x)
    f <- function(b){return(gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2)}
    bhat <- uniroot(f,c(0.02,50))$root
    ahat <- xbar/gamma(1+1/bhat)
    return(c(ahat,bhat))
}

यह ऊपर दिए गए दो ऋषि उदाहरणों को पुन: पेश करता है (पांच महत्वपूर्ण अंकों के लिए):

x <- c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
     51,77,78,144,34,29,45,16,15,37,218,170,44,121)
fit_weibull(x)
[1] 81.316840  1.381145

x <- c(23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121)
fit_weibull(x)
[1] 78.479180  1.293821

4

θfitdistrθθfitdistr

foo <- function(theta, x)
{
  if (theta <= -min(x)) return(Inf);
  f <- fitdistr(x+theta, 'weibull')
  -2*f$loglik
}

फिर एक आयामी अनुकूलन का उपयोग करके इस फ़ंक्शन को कम करें:

bar <- optimize(foo, lower=-min(x)+0.001, upper=-min(x)+10, x=x)

जहाँ मैंने अभी कुछ भी नहीं के आधार पर "+10" बनाया है।

शून्य से प्रतिस्थापित तीन सबसे छोटे मूल्यों वाले डेटा के लिए, हमें यह मिलता है:

> bar
$minimum
[1] 2.878442

$objective
[1] 306.2792

> fitdistr(x+bar$minimum, 'weibull')
     shape        scale   
   1.2836432   81.1678283 
 ( 0.1918654) (12.3101211)
> 

bar$minimumθfitdistrθ


2

यह विफल होना चाहिए, आपको आभारी होना चाहिए कि यह विफल हो गया।

आपकी टिप्पणियों से पता चला कि असफलताएं उसी क्षण आईं जब आप उन्हें देखना शुरू कर रहे थे। यदि यह एक वास्तविक प्रक्रिया है, तो वास्तविक (और सिम्युलेटेड डेटा नहीं) से आ रही है, आपको किसी कारण से इस बात की आवश्यकता है कि आपको शून्य क्यों मिल रहा है। मैंने जीवित रहने के अध्ययन को देखा है जहां 0 बार कई चीजों में से एक के परिणामस्वरूप दिखाई देता है:

  1. डेटा को वास्तव में काट दिया जाता है: अध्ययन शुरू होने से पहले ऑब्जेक्ट जोखिम में थे और विफल हो गए थे और आप बहाना चाहते थे कि आपने उन सभी को देखा था।
  2. उपकरण खराब रूप से कैलिब्रेट किए जाते हैं: आपके पास अध्ययन के लिए पर्याप्त माप सटीकता नहीं है और इसलिए प्रारंभ समय के पास होने वाली विफलताएं बिल्कुल शून्य के रूप में कोडित की गईं।
  3. शून्य के रूप में कोडित चीज शून्य नहीं है। वे लोग या वस्तुएं हैं जिन्हें विश्लेषण से एक या दूसरे तरीके से बाहर रखा गया था। शून्य बस डेटा में विलय, छँटाई, या अन्यथा लापता मानों को फिर से भरने के परिणामस्वरूप दिखाता है।

तो मामले 1 के लिए: आपको उचित सेंसरिंग विधियों का उपयोग करने की आवश्यकता है, भले ही इसका मतलब है कि पूर्वव्यापी रूप से रिकॉर्ड खींच रहा है। केस 2 का मतलब है कि आप ईएम एल्गोरिथ्म का उपयोग कर सकते हैं क्योंकि आपके पास एक सटीक मुद्दा है। बायेसियन तरीके यहां भी इसी तरह काम करते हैं। केस 3 का मतलब है कि आपको केवल उन मूल्यों को बाहर करने की आवश्यकता है जो गायब होने वाले थे।


ओपी ने समझाया कि एक पिछले शोधकर्ता ने एक वेइबुल वितरण को फिट करने के लिए चुना, भले ही डेटा वास्तविक-दुनिया की गिनती हो - कुछ की घटनाओं की संख्या के गैर-नकारात्मक पूर्णांक मायने रखता है। यह स्पष्ट नहीं है कि आपके तीन मामले ऐसी स्थिति से कैसे संबंधित हैं।
रेस

ओह, अच्छा नोट! वेइबुल वितरण के लिए फिटिंग उदाहरण के लिए गलत है। इसका निरंतर समर्थन है और इसका उपयोग कभी भी मॉडल की गणना करने के लिए नहीं, बल्कि उत्तरजीविता के समय के लिए किया जाता है। नकारात्मक द्विपद वितरण, मॉडलिंग गणना के लिए एक समान दो पैरामीटर वितरण होगा, जो निश्चित रूप से डेटा-जनरेट करने की प्रक्रिया की प्रकृति पर निर्भर करता है (जिनमें से हमारे पास 0 जानकारी है, जैसा कि समस्या बताई गई है)। मुझे यह बताने के लिए धन्यवाद।
एडमो

1

मैं ऊपर कार्डिनल के उत्तर से सहमत हूं। हालांकि, शून्य से बचने के लिए एक निरंतर जोड़ना भी काफी आम है। आमतौर पर उपयोग किया जाने वाला दूसरा मान 0.5 है, लेकिन किसी भी सकारात्मक निरंतर का उपयोग किया जा सकता है। आप यह देखने के लिए मानों की एक श्रृंखला आज़मा सकते हैं कि क्या आप पिछले शोधकर्ता द्वारा उपयोग किए गए सटीक मान की पहचान कर सकते हैं। फिर आप आश्वस्त हो सकते हैं कि बेहतर वितरण के लिए खोज पर जाने से पहले आप उसके परिणामों को पुन: पेश करने में सक्षम हैं।


0

[वीबुल मान लेना उचित है] जॉनसन कोटज़ और बालाकृष्णन की पुस्तक में वीबुल मापदंडों का अनुमान लगाने के कई तरीके हैं। इनमें से कुछ डेटा पर निर्भर नहीं हैं, जिसमें शून्य शामिल नहीं हैं (जैसे कि माध्य और मानक विचलन का उपयोग करके, या कुछ निश्चित प्रतिशत का उपयोग करके)।

जॉनसन, एनएल, कोटज़, एस, और बालाकृष्णन, एन (1994)। सतत अविभाज्य वितरण। न्यूयॉर्क: विली, पृष्ठ 632 पर मोटे तौर पर।

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