วิธีปรับให้พอดีกับการแจกแจงแบบ Weibull กับข้อมูลอินพุตที่มีเลขศูนย์


14

ฉันกำลังพยายามสร้างอัลกอริทึมการทำนายที่มีอยู่โดยนักวิจัยที่เกษียณแล้ว ขั้นตอนแรกคือเพื่อให้พอดีกับข้อมูลที่สังเกตได้บางอย่างกับการแจกแจงแบบ Weibull เพื่อให้ได้รูปร่างและมาตราส่วนซึ่งจะใช้ในการทำนายค่าในอนาคต ฉันใช้ 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')

สิ่งนี้ทำงานได้ดียกเว้นว่ามีเลขศูนย์ใด ๆ ในอาร์เรย์อินพุตซึ่งทำให้มันล้มเหลวอย่างสมบูรณ์ สิ่งเดียวกันเกิดขึ้นใน SAS ดังที่ฉันเข้าใจแล้วนี่เป็นเพราะหนึ่งในขั้นตอนในการคำนวณการแจกแจงแบบ Weibull คือการบันทึกตามธรรมชาติซึ่งไม่ได้กำหนดไว้สำหรับ 0 มีวิธีที่เหมาะสมในการแก้ไขปัญหานี้หรือไม่?

สิ่งที่ดีที่สุดที่ฉันเคยพบคือการเพิ่ม 1 ให้กับค่าอินพุตทั้งหมดของฉันให้พอดีกับเส้นโค้งแล้วลบหนึ่งค่าจากค่าที่คาดการณ์ไว้ของฉัน ("เลื่อน" เส้นโค้งขึ้นแล้วกลับลง 1) ซึ่งตรงกับข้อมูลที่คาดการณ์ไว้ก่อนหน้านี้ค่อนข้างดี แต่ดูเหมือนว่ามันจะต้องเป็นวิธีที่ผิดในการทำเช่นนั้น

แก้ไข: ค่าในอาร์เรย์อินพุตจะถูกตรวจสอบข้อมูลในโลกแห่งความเป็นจริง (จำนวนการเกิดขึ้นของบางสิ่งบางอย่าง) เป็นระยะเวลาหลายปี ดังนั้นในบางปีจำนวนการเกิดขึ้นจึงเป็นศูนย์ ไม่ว่าจะเป็นวิธีที่ดีที่สุดหรือไม่ (ฉันยอมรับว่าอาจไม่ใช่) ผู้เขียนอัลกอริทึมดั้งเดิมอ้างว่าใช้การกระจาย Weibull และฉันต้องพยายามทำซ้ำกระบวนการของพวกเขา


5
Weibull คือการแจกแจงแบบต่อเนื่องเพื่อให้ความน่าจะเป็นที่ได้ศูนย์เท่ากับมีความน่าจะเป็นศูนย์ หากคุณได้รับศูนย์จำนวนมากในข้อมูลของคุณนั่นเป็นเบาะแสทันทีที่ Weibull ไม่เหมาะสม ข้อมูลของคุณจะมีลักษณะเหมือนนับข้อมูล (หรืออย่างน้อยก็ไม่ต่อเนื่อง) ดังนั้น Weibull อาจไม่ใช่ตัวเลือกที่ดีที่สุด
พระคาร์ดินัล

การเพิ่มบริบทให้กับที่มาของข้อมูลจะช่วยให้ทุกคนที่พยายามตอบคำถามอย่างมหาศาล
พระคาร์ดินัล

คำตอบ:


8

(ตามที่คนอื่น ๆ ระบุไว้การกระจาย Weibull นั้นไม่น่าจะเป็นการประมาณที่เหมาะสมเมื่อข้อมูลเป็นจำนวนเต็มเท่านั้นข้อมูลต่อไปนี้มีวัตถุประสงค์เพื่อช่วยให้คุณกำหนดสิ่งที่นักวิจัยก่อนหน้านี้ทำถูกหรือผิด)

มีวิธีการทางเลือกหลายวิธีที่ไม่ได้รับผลกระทบจากศูนย์ในข้อมูลเช่นการใช้ตัวประมาณค่าช่วงเวลาแบบต่างๆ โดยทั่วไปแล้วต้องการวิธีแก้ปัญหาเชิงตัวเลขของสมการที่เกี่ยวข้องกับฟังก์ชันแกมมาเนื่องจากช่วงเวลาของการแจกแจงแบบ Weibull นั้นให้ในรูปของฟังก์ชันนี้ ฉันไม่คุ้นเคยกับ R แต่นี่เป็นโปรแกรมSageที่แสดงวิธีการที่ง่ายกว่า - บางทีมันสามารถปรับให้เหมาะกับ R ได้ (คุณสามารถอ่านเกี่ยวกับสิ่งนี้และวิธีการอื่น ๆ เช่นใน"การแจกจ่าย Weibull: คู่มือ"โดย Horst Rinne, หน้า 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 เพื่อลอง เสี่ยงต่อการทำให้คำตอบนี้ยาวเกินไปสำหรับผู้ที่สนใจรหัส R ของฉันสำหรับวิธีการ Blischke-Scheuer ของฉัน:

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

การทำซ้ำนี้ (เป็นเลขนัยสำคัญห้าตัว) ทั้งสองตัวอย่าง Sage ด้านบน:

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 หมายความว่าคุณสามารถใช้อัลกอริทึม EM ได้เนื่องจากคุณมีปัญหาที่แม่นยำ วิธีการแบบเบย์ทำงานคล้ายกันที่นี่เช่นกัน กรณีที่ 3 หมายความว่าคุณเพียงแค่ต้องแยกค่าที่ควรจะหายไป


สหกรณ์อธิบายว่านักวิจัยก่อนหน้านี้เลือกที่จะพอดีกับการกระจาย Weibull แม้ว่าข้อมูลที่เป็นจริงของโลกนับ - ไม่ใช่เชิงลบจำนวนเต็มนับจำนวนของการเกิดขึ้นของบางสิ่งบางอย่าง มันไม่ชัดเจนว่าคดีทั้งสามของคุณเกี่ยวข้องกับสถานการณ์ดังกล่าวอย่างไร
res

โอ้ทราบดี! การปรับให้เหมาะสมกับการกระจาย Weibull นั้นผิดปกติอย่างมาก มันมีการสนับสนุนอย่างต่อเนื่องและไม่เคยชินกับแบบจำลองนับ แต่เวลาอยู่รอด การแจกแจงแบบทวินามเชิงลบจะเป็นการเรียงลำดับของการแจกแจงพารามิเตอร์สองแบบที่เทียบเท่ากันสำหรับการนับแบบจำลองซึ่งแน่นอนขึ้นอยู่กับลักษณะของกระบวนการสร้างข้อมูล (ซึ่งเรามี 0 ข้อมูลตามที่ระบุปัญหา) ขอบคุณที่ชี้นำฉัน
AdamO

1

ฉันเห็นด้วยกับคำตอบของพระคาร์ดินัลข้างต้น อย่างไรก็ตามมันเป็นเรื่องธรรมดาที่จะเพิ่มค่าคงที่เพื่อหลีกเลี่ยงค่าศูนย์ ค่าอื่นที่ใช้กันทั่วไปคือ 0.5 แต่อาจมีการใช้ค่าคงที่เชิงบวกใด ๆ คุณอาจลองช่วงของค่าเพื่อดูว่าคุณสามารถระบุค่าที่แน่นอนที่ใช้โดยนักวิจัยก่อนหน้านี้ จากนั้นคุณสามารถมั่นใจได้ว่าคุณสามารถทำซ้ำผลลัพธ์ของเขาก่อนที่จะค้นหาการกระจายที่ดีขึ้น


0

[สมมติว่า Weibull เหมาะสม] หนังสือของ Johnson Kotz และ Balakrishnan มีหลายวิธีในการประมาณค่าพารามิเตอร์ Weibull บางส่วนไม่ได้ขึ้นอยู่กับข้อมูลที่ไม่รวมศูนย์ (เช่นการใช้ค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานหรือการใช้เปอร์เซ็นไทล์ที่แน่นอน)

Johnson, NL, Kotz, S. และ Balakrishnan, N. (1994) การแจกแจง Univariate อย่างต่อเนื่อง นิวยอร์ก: ไวลีย์ประมาณหน้า 632

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.