NMinimize с функцией, содержащей случайные величины

Мне было интересно, можно ли использовать NMinimize от Mathematica с целевой функцией, которая содержит случайные величины? Например, у меня есть функция с параметрами, которые следуют за распределением (нормальное и усеченное нормальное). Я хочу подогнать его гистограмму к имеющимся у меня данным и построил целевую функцию, которую теперь мне нужно минимизировать (поэтому целевая функция зависит от параметров и параметров и должна быть определена). Если я запускаю свой код, появляется сообщение об ошибке: он утверждает, что параметр для NormalDistribution должен быть положительным (если я подключаю цифры для mus и sigmas моей целевой функции вручную, я не получаю сообщение об ошибке). Итак, мне интересно, если NMinimize не может обрабатывать неаналитическую функцию. Спасибо! Здесь я приведу пример кода (обратите внимание, что исходная функция более сложная)


listS и listT - это списки времени события. Я хочу подогнать кривую моей статистической модели по времени (здесь очень простая, она состоит из усеченного нормального распределения) к имеющимся у меня данным. Для этого я сравниваю кривые выживания и нужно минимизировать сумму наименьших квадратов. Моя проблема в том, что функция NMinimize не работает. (Обратите внимание, что исходная целевая функция состоит из более сложной функции с параметрами, которые являются случайными величинами)

(* Оба списка должны быть списком раз *)

SurvivalS[listeS_, x_] := Module[{res, survivald},
survivald = SurvivalDistribution[listeS];
res = SurvivalFunction[survivald, x];
res]
Residuum[listeT_, listeS_] := 
Table[(SurvivalS[listeT, listeT[[i]]] - SurvivalS[listeS, listeT[[i]]]), {i,
 1, dataN}];
LeastSquare[listeT_, listeS_] := 
Total[Function[x, x^2] /@ 
Residuum[listeT, 
 listeS]];(* objective function, here ist is the sum of least square *)

objectiveF[mu_, sigma_] := 
Piecewise[{{LeastSquare[listeT, listeS[mu, sigma]], mu > 0 && sigma > 0}}, 
20 (1 + (sigma + mu)^2)];

pool = 100; (* No. points from MonteCarlo *)

listeS[mu_, sigma_] := RandomVariate[TruncatedDistribution[{0, 1}, NormalDistribution[mu, sigma]],pool];(* simulated data *)
listeT = Sort[RandomVariate[TruncatedDistribution[{0, 1}, NormalDistribution[.5, .9]],60]]; (* list of "measured" data *)
dataN = Length[listeT];
NMinimize[objectiveF[mu, .9], {{mu, .4}}]

Сообщение об ошибке: "RandomVariate::realprm: параметр mu в позиции 1 в NormalDistribution[mu,0.9] должен быть реальным. >>"

0 ответов

Другие вопросы по тегам