Làm cách nào để khớp phân phối Weibull với dữ liệu đầu vào chứa số 0?


14

Tôi đang cố gắng tái tạo một thuật toán dự đoán hiện có, được lưu truyền bởi một nhà nghiên cứu đã nghỉ hưu. Bước đầu tiên là điều chỉnh một số dữ liệu được quan sát cho phân phối Weibull, để có được hình dạng và tỷ lệ sẽ được sử dụng để dự đoán các giá trị trong tương lai. Tôi đang sử dụng R để làm điều này. Đây là một ví dụ về mã của tôi:

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

Điều này hoạt động tốt trừ khi có bất kỳ số 0 nào trong mảng đầu vào, khiến nó bị hỏng hoàn toàn. Điều tương tự cũng xảy ra ở SAS. Theo tôi hiểu, điều này là do một trong các bước trong tính toán phân phối Weibull là lấy nhật ký tự nhiên, không xác định cho 0. Có cách nào hợp lý để giải quyết vấn đề này không?

Điều tốt nhất tôi tìm thấy cho đến nay là thêm 1 vào tất cả các giá trị đầu vào của mình, khớp với đường cong và sau đó trừ đi một giá trị từ các giá trị dự đoán của tôi ("dịch chuyển" đường cong lên và sau đó giảm xuống 1). Điều này phù hợp với dữ liệu dự đoán trước đó khá tốt, nhưng có vẻ như đó là một cách làm sai.

chỉnh sửa: Các giá trị trong mảng đầu vào được quan sát, dữ liệu trong thế giới thực (số lần xuất hiện của một cái gì đó) trong một phạm vi năm. Vì vậy, trong một số năm, số lần xuất hiện là bằng không. Cho dù đó là cách tốt nhất hay không (tôi đồng ý rằng nó có thể không), tác giả thuật toán ban đầu tuyên bố đã sử dụng phân phối Weibull và tôi phải cố gắng sao chép quy trình của họ.


5
Weibull là một phân phối liên tục để xác suất nhận được chính xác bằng 0 có xác suất bằng không. Nếu bạn nhận được nhiều số không trong dữ liệu của mình, đó là manh mối ngay lập tức rằng Weibull không phù hợp. Ở mọi mức độ, dữ liệu của bạn trông giống như dữ liệu đếm (hoặc ít nhất là rời rạc) và do đó, Weibull có lẽ không phải là lựa chọn tốt nhất.
hồng y

Thêm một số bối cảnh như dữ liệu đến từ đâu sẽ giúp bất cứ ai cố gắng trả lời rất nhiều.
Đức hồng y

Câu trả lời:


8

(Như những người khác đã chỉ ra, phân phối Weibull dường như không phải là một xấp xỉ thích hợp khi dữ liệu chỉ là số nguyên. Dưới đây chỉ nhằm mục đích giúp bạn xác định những gì nhà nghiên cứu trước đó đã làm, đúng hay sai.)

Có một số phương pháp thay thế không bị ảnh hưởng bởi các số 0 trong dữ liệu, chẳng hạn như sử dụng các công cụ ước tính khoảnh khắc phương pháp khác nhau. Chúng thường yêu cầu giải pháp số phương trình liên quan đến hàm gamma, bởi vì các khoảnh khắc của phân phối Weibull được đưa ra theo chức năng này. Tôi không quen thuộc với R, nhưng đây là một chương trình Sage minh họa một trong những phương pháp đơn giản hơn - có lẽ nó có thể được điều chỉnh theo R? (Bạn có thể đọc về phương pháp này và các phương pháp khác như vậy, ví dụ: "Phân phối Weibull: một cuốn cẩm nang" của Horst Rinne, trang 455ff - tuy nhiên, có một lỗi đánh máy trong eq.12.4b của anh ấy, như '-1' là dư thừa).

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

Điều này tạo ra đầu ra

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]

sau đó cùng một thủ tục tạo ra đầu ra

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


EDIT: Tôi vừa cài đặt R để dùng thử. Có nguy cơ khiến câu trả lời này quá lâu, đối với bất kỳ ai quan tâm ở đây là mã R của tôi cho phương pháp 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))
}

Điều này sao chép (đến năm chữ số có nghĩa) hai ví dụ Sage ở trên:

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

Bạn cũng có thể thử điều chỉnh Weibull ba tham số, trong đó tham số thứ ba là tham số vị trí, hãy để chúng tôi nói θ. Số tiền này để ước tính hằng số mà bạn nên thêm vào dữ liệu để giúp bạn phù hợp nhất với Weibull. Bạn có thể thực hiện việc này bằng cách sử dụng phương pháp tiếp cận hồ sơ bằng cách đặt "trình bao bọc" xung quanh fitdistr, trong đó trình bao bọc có giá trị làθ và dữ liệu, thêm θđến dữ liệu, gọi fitdistrhàm và trả về logliklihood liên quan:

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

Sau đó tối thiểu hóa chức năng này bằng cách sử dụng tối ưu hóa một chiều:

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

nơi tôi vừa tạo ra "+10" dựa trên không có gì cả.

Đối với dữ liệu có ba giá trị nhỏ nhất được thay thế bằng số 0, chúng tôi nhận được:

> 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 là MLE của θvà các fitdistrđầu ra là các MLE của các tham số Weibull, cùng vớiθđó là. Như bạn có thể thấy, chúng khá gần với các công cụ ước tính thời điểm @res đã trình bày ở trên.


2

Nó nên thất bại, bạn nên biết ơn rằng nó đã thất bại.

Quan sát của bạn cho thấy rằng những thất bại xảy ra tại thời điểm bạn bắt đầu quan sát chúng. Nếu đây là một quá trình thực sự, đến từ dữ liệu thực (và không phải mô phỏng), bạn cần bằng cách nào đó giải thích lý do tại sao bạn nhận được số không. Tôi đã thấy các nghiên cứu sinh tồn trong đó 0 lần xuất hiện là kết quả của một trong nhiều điều:

  1. Dữ liệu thực sự bị cắt ngắn: các đối tượng có nguy cơ và thất bại trước khi nghiên cứu bắt đầu và bạn muốn giả vờ rằng bạn đã quan sát tất cả chúng cùng.
  2. Các công cụ được hiệu chuẩn kém: bạn không có đủ độ chính xác đo lường cho nghiên cứu và do đó, những thất bại xảy ra gần thời gian bắt đầu được mã hóa chính xác bằng không.
  3. Thứ được mã hóa thành số 0 không phải là số không. Họ là người hoặc đối tượng bị loại khỏi phân tích theo cách này hay cách khác. Số 0 chỉ hiển thị trong dữ liệu là kết quả của việc hợp nhất, sắp xếp hoặc mã hóa lại các giá trị bị thiếu.

Vì vậy, đối với trường hợp 1: bạn cần sử dụng các phương pháp kiểm duyệt thích hợp, ngay cả khi điều đó có nghĩa là thu hồi hồ sơ. Trường hợp 2 có nghĩa là bạn có thể sử dụng thuật toán EM vì bạn có vấn đề chính xác. Phương pháp Bayes cũng hoạt động tương tự ở đây. Trường hợp 3 có nghĩa là bạn chỉ cần loại trừ các giá trị được cho là bị thiếu.


OP giải thích rằng một nhà nghiên cứu trước đó đã chọn điều chỉnh phân phối Weibull, mặc dù dữ liệu là số đếm trong thế giới thực - số nguyên không âm của số lần xuất hiện của một thứ gì đó. Không rõ ba trường hợp của bạn liên quan đến tình huống như thế nào.
res

Ồ, lưu ý tốt! Phù hợp với phân phối Weibull là rất sai. Nó có hỗ trợ liên tục và không bao giờ được sử dụng để mô hình số lượng nhưng thời gian sống sót. Phân phối nhị thức âm sẽ là một loại phân phối hai tham số tương đương cho số lượng mô hình hóa, tất nhiên phụ thuộc vào bản chất của quá trình tạo dữ liệu (trong đó chúng tôi có 0 thông tin, như đã nêu vấn đề). Cảm ơn đã chỉ ra điều đó cho tôi.
AdamO

1

Tôi đồng ý với câu trả lời của hồng y ở trên. Tuy nhiên, nó cũng khá phổ biến để thêm một hằng số để tránh các số không. Một giá trị khác thường được sử dụng là 0,5, nhưng bất kỳ hằng số dương nào cũng có thể được sử dụng. Bạn có thể thử một loạt các giá trị để xem liệu bạn có thể xác định giá trị chính xác được sử dụng bởi nhà nghiên cứu trước đó hay không. Sau đó, bạn có thể tự tin rằng bạn có thể tái tạo kết quả của anh ấy, trước khi tiếp tục tìm kiếm phân phối tốt hơn.


0

[Giả sử Weibull là phù hợp] Cuốn sách của Johnson Kotz và Balakrishnan có rất nhiều cách để ước tính các thông số của Weibull. Một số trong số này không phụ thuộc vào dữ liệu không bao gồm số 0 (ví dụ: sử dụng giá trị trung bình và độ lệch chuẩn hoặc sử dụng một số phần trăm nhất định).

Johnson, NL, Kotz, S. và Balakrish Nam, N. (1994). Phân phối đơn biến liên tục. New York: Wiley, đại khái ở trang 632.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.