В настоящее время я имею дело с проблемой. Я работаю над пакетом для некоторых конкретных дистрибутивов, среди прочего, я хотел бы создать функцию, которая будет соответствовать смеси некоторым данным. Для этого я хотел бы использовать, например, функцию fitdistr
. Проблема в том, что я не знаю, из каких распределений и весов и количества компонентов будет состоять смесь. Следовательно, мне нужна функция, которая будет динамически создавать функцию плотности некоторой определенной смеси, поэтому функция fitdistr
может ее использовать. Например, если пользователь будет вызывать:Динамическое создание функций и выражений
fitmix(data,dist=c(norm,chisq),params=list(c(mean=0,sd=3),df=2),wights=c(0.5,0.5))
использовать метод ML код должен создать функцию плотности
function(x,mean,sd,df) 0.5*dnorm(x,mean,sd)+0.5*dchisq(x,df)
поэтому он может позвонить optim
или fitdistr
.
Очевидным решением является использование большого количества paste
+ eval
+ parse
, но я не думаю, что это самое элегантное решение. Хорошее решение, вероятно, скрывается где-то в нестандартной оценке и манипуляции выражениями, но у меня недостаточно навыков в этой проблематике.
P.S. параметры могут использоваться как начальные значения для оптимизатора.
Пробовали ли вы что-нибудь? Это в основном чтение, как вопрос «пожалуйста, код для меня», который не рекомендуется на этом сайте. Если бы вы могли задать более конкретный вопрос или хотя бы показать код, который вы попытались, это улучшит ваш вопрос. – MrFlick
Этот пример является гораздо более упрощенной версией реальной задачи, поэтому мой код не помог бы с вопросом. Я смог создать вызов с помощью пасты, например, lapply (seq_along (D), function (i) paste (dist [i], paste ("(x,", paste (names (params [[i]]), collapse = ","), ")", sep = ""), sep = "")) + вставить их вместе, а также попробовать as.call, но без каких-либо хороших результатов –