Как смоделировать прерывистый спрос в MATLAB? - PullRequest
4 голосов
/ 30 октября 2019

Контекст: Прерывистый спрос относится к данным временных рядов (спрос), которые характеризуются наличием периодов с нулевым спросом. Эти ненулевые требования часто являются небольшими, но в то же время сильно варьируемымиПрерывистый спрос имеет множество применений и создает проблемы для многих традиционных систем прогнозирования и управления.

Как генерировать случайные выборки прерывистого спроса в MATLAB?

В R * 1009Пакет *tsintermittent, есть функция для имитации прерывистого спроса, которая называется simID.
Мне не известны какие-либо встроенные функции MATLAB для достижения этой цели (и я очень сомневаюсьони существуют).

Соответствующие параметры включают изменчивость и прерывистость .

1 Ответ

5 голосов
/ 30 октября 2019

Эту функцию можно реплицировать в MATLAB с помощью панели инструментов Статистика, используя nbinrnd и binornd.

Синтаксис [d] = simID(n, obs, adi, cv2, level) с

n : количество создаваемых потоков спроса
obs : количество периодов времени для имитации
adi : средний интервал спроса (периоды времени)
cv2 : коэффициент вариации квадрат
уровень :среднее из ненулевых требований
d : матрица 'n' x 'obs' с указанными потоками требований

Это явно предполагает, что ненулевые поступления спроса следуют за распределением Бернулли и ненулевое значение требует отрицательного биномиального распределения . [1]

[1] Петропулос Ф., Макридакис С., АссимакопулосV. & Nikolopoulos K. (2014) «Лошади для курсов» в прогнозировании спроса », European Journal of Operational Research , Vol. 237, № 1, с. 152-163.

% Test in MATLAB 
D = simID(1,50000,2.5,2.5,3);

mean(D)                          % 1.2089
std(D)                           % 3.3913
# Test in R
# install.packages('tsintermittent')
library('tsintermittent')

D = simID(1,50000,2.5,2.5,3)
mean(D$ts.1)                      # 1.19632
sd(D$ts.1)                        # 3.261225

Значения не совпадают точно из-за отсутствия одинакового случайного начального числа.


Код MATLAB: (протестировано с R2019a)

function [d] = simID(n, obs, adi, cv2, level)
% n: number of demand streams to create
% obs: number of time periods to simulate
% adi: average demand interval
% cv2: coefficient of variation squared
% level: average of nonzero demand 
%
% d: 'n' x 'obs' matrix with the specified demand streams
%
% If 'level' empty, defaults to sample from Uniform(10,100). 
% 
% MATLAB implementation of simID() from 'tsintermittent' package for R
% https://www.rdocumentation.org/packages/tsintermittent/versions/1.9/topics/simID
% https://CRAN.R-project.org/package=tsintermittent
%
% This simulator assumes that non-zero demand arrivals follow a bernoulli distribution 
% and the non-zero demands a negative binomial distribution. 
% Petropoulos F., Makridakis S., Assimakopoulos V. & Nikolopoulos K. (2014) 
% "'Horses for Courses' in demand forecasting", 
% European Journal of Operational Research, Vol. 237, No. 1, pp. 152-163

% Input Error Checking ****************************************************
narginchk(3,5)
if isempty(level), level = 10 + 90*rand(); end
if cv2<=0, error('cv2 must be positive'), end
if n<0 || obs<0 || adi < 0, error('n, obs, and adi must be positive'), end
% End (Input Error Checking) **********************************************

m = level - 1;
if ( cv2 ~= 0)
    p = (m / ( cv2 * ( (m+1)^2) ) ); % calculates the p for negative binomial function
    r = m * p / (1 - p); % calculates the r for the negative binomial funcion
    d = binornd(1, 1 / adi, n, obs) .* (nbinrnd(r, p, n, obs) + 1);
else
    d = binornd(1, 1/adi, n, obs) .* repmat(m + 1, n, obs);
end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...