Poisson-Distribution

負二項式參數可以像泊鬆一樣處理嗎?

  • September 14, 2020

我有一個計數過程,我想用泊松過程建模。每 30 分鐘測量一次數據,通過泊松分佈,我可以使用 lambda 的擬合值輕鬆測量給定事件計數在不同時間段內異常的概率,即“是我們在30 分鐘異常?最後一個小時呢?我們在過去 1.5 小時內看到的事件數量是否異常?”等。

問題是我的數據過於分散,並且肯定可以用負二項分佈很好地描述。我選擇使用參數 $ (\mu, \alpha) $ 因為這就是 PyMC3 使用的,在哪裡 $ \mu $ 等效於泊松分佈中的 lambda。

有沒有辦法以與泊松率參數相同的方式利用負二項式參數,我可以查看某個時間段 t 內的事件計數是否異常(我可以將 t 擴展到不同的時間段)?

我在 PyMC3 中放置了一些代碼來執行此任務,因為您在問題中提到了它。您似乎已經熟悉的第一部分是擬合模型以獲得參數的後驗分佈:

import pymc3 as pm
import numpy as np

# generating simulated data data for a week
data = pm.NegativeBinomial.dist(mu=3, alpha=1).random(size=7*24*2)

# defining the model and sampling (MCMC)
with pm.Model() as model:
   alpha = pm.Exponential("alpha", 2.0)
   mean = pm.Exponential("mean", 0.2)
   obs_data = pm.NegativeBinomial("obs_data", mu=mean, alpha=alpha, observed=data)
   trace = pm.sample()

# plotting the posterior
pm.traceplot(trace)
pm.plot_posterior(trace)

現在我們來看看你似乎在苦苦掙扎的部分。我們可以使用這個很好的屬性:當兩個隨機變量, $ X $ 和 $ Y $ 具有相同的過度離散參數的負二項分佈,則 $ X+Y $ 也有負二項分佈,均值 $ \mathbb E[X]+\mathbb E[Y] $ 和相同的過度分散參數 $ X $ 和 $ Y $ . 您可以在此處找到此屬性的證明。

假設負二項式參數是固定的(正式地,假設您的隨機過程屬於Lévy 過程的類,其中包括泊松過程),這意味著如果您想知道一小時內事件數的分佈或者一整天,你只需要調整平均值,就像你對泊松過程所做的那樣。

例如,要找出在一天內找到 200 多個事件的非典型情況,我們可以使用以下命令:

np.mean(pm.NegativeBinomial.dist(mu=48*trace["mean"], alpha=trace["alpha"]).random(10**4)>200)

讓我們稍微分解一下這行代碼。當我們使用 時pm.NegativeBinomial.dist(mu=..., alpha=...),我們使用一組特定的參數調用負二項式的 PyMC3 實現(我們也可以使用 Numpy 實現,但它們的參數化方式不同,因此堅持使用 PyMC3 不太容易出錯)。

然後,我們使用從後驗中採樣的參數:alpha=trace["alpha"]過度離散和mu=48*trace["mean"]均值(我們乘以 48 以調整該均值以反映 24 小時而不是半小時)。

最後,我們從這個分佈中採樣許多實例,並將它們與我們感興趣的值 ( .random(10**4)>200) 進行比較,然後從我們的負二項式過程中找到新樣本超過它的概率(通過應用於np.mean結果布爾數組)。結果是您的模型每天生成 200 個或更多事件的概率。

這裡有一些警告:

  • 如果您的模型允許過度分散隨時間變化,那麼這些都不起作用
  • 如果您的模型允許泊松率作為某些函數隨時間變化 $ \lambda(t) $ ,這將不得不有所調整。您不必將比率乘以某個數字,而是必須積分 $ \lambda(t) $ ,使這有點複雜。

編輯: 我正在編輯以解決@J 的評論,詢問有關星期幾的影響。因此,讓我們首先生成一些具有強烈星期幾影響的數據:

# how many weeks of data are available?
WEEKS = 5
# how many observations are available per day?
OBS_PER_DAY = 24*2

data = pm.NegativeBinomial.dist(mu=[2,3,1,2,5,9,7]*5, alpha=1).random(size=OBS_PER_DAY).T.flatten()

現在,我們可以解決這個問題的一種方法是使用 7 種不同的方法,而不是單一的方法。PyMC3 模型可以寫成:

with pm.Model() as model:
   alpha = pm.Exponential("alpha", 2.0)
   mean = pm.Exponential("mean", 0.2, shape=7)
   day = np.arange(WEEKS*7*OBS_PER_DAY)//OBS_PER_DAY%7
   obs_data = pm.NegativeBinomial("obs_data", mu=mean[day], alpha=alpha,
       observed=data)
   trace = pm.sample()

這裡的變量將day每個觀察結果與它來自的星期幾相關聯。現在,我們有一個模型可以考慮星期幾的效果。我們如何檢查星期五有超過 500 個事件是否非典型?該過程類似於同質情況:

friday = 4 # assuming the week starts on monday
np.mean(pm.NegativeBinomial.dist(mu=48*trace["mean"][:,friday], alpha=trace["alpha"]).random(10**4)>500)

好的,現在如果我們要檢查一周內的 3000 個事件是否是非典型事件怎麼辦?一周的預期事件數是48*sum(mean),所以我們這樣做:

np.mean(pm.NegativeBinomial.dist(mu=48*trace["mean"].sum(axis=1), alpha=trace["alpha"]).random(10**4)>3000)

請注意,我們不需要任何花哨的集成,因為這種星期幾的效果使 $ \lambda(t) $ 分段常數函數。(萬歲!)。當函數形式有點複雜時,您不需要積分泊松率:例如,如果 $ \lambda(t) $ 是多項式、指數、從高斯過程中採樣的函數等。不幸的是,似乎很難在網上找到關於這個特定主題的資源……也許我會在這個答案中添加一些解決這個問題的東西找時間。

希望我有幫助!

引用自:https://stats.stackexchange.com/questions/487418

comments powered by Disqus