#r #histogram #curve-fitting
#r #гистограмма #подгонка по кривой #подгонка кривой
Вопрос:
Мне нужно сопоставить с R гистограмму, содержащую пиковый сигнал плюс плоский фон. Как эти:
рис. http://wwwasd.web.cern.ch/wwwasd/paw/contributions/bwp4_fit.gif
Как я могу эффективно работать в R? Я не нашел ни одной хорошей ссылки в Интернете. Я привык делать это в ROOT: http://root.cern.ch/root/html/tutorials/fit/FittingDemo.C.html но в R это не так просто…
Я кое-что сделал, используя fitdistr (МАССОВЫЙ пакет), но он работает хорошо, только если я использую одно заданное распределение (например, гауссово). Если я попытаюсь добавить к гауссову плоскому (однородному) фону, добавив параметр для относительного присутствия двух распределений:
f = gaus(mean, sigma) r * uniform
с параметрами mean, sigma и r free подгонка больше не работает.
Типичными ошибками являются:
Error in solve.default(res$hessian) :
Lapack routine dgesv: system is exactly singular: U[1,1] = 0
In addition: There were 28 warnings (use warnings() to see them)
или просто нет конвергенции.
Наконец, я не понимаю, как R имеет дело с константами нормализации (мультипликативные параметры перед каждым добавленным распределением). Я предполагаю, что если мы подберем частоты, то все (гистограмма и кривая подгонки) уже должны быть нормализованы до единицы.. Следовательно, единственным новым параметром при добавлении плоского фона к пиковому сигналу должен быть относительный вес (r в приведенном выше примере). Так ли это?
Спасибо, Марко
Комментарии:
1. Там нет гистограммы. У вашего вставленного изображения нет смещения фона. Если вам нужна существенная помощь, вам нужно опубликовать точный код и воспроизводимый образец данных. В то же время предположение: несколько процедур подгонки завершатся неудачно из-за отсутствия шума. Возможно, что, загружая
solve.default
«идеальный» набор данных, вы где-то получаете единственную матрицу.2. Изображение было просто примером, взятым из Google, для описания концепции. В любом случае код с точным набором данных может быть примерно таким: b <- runif(1000, 0, 10) s <- rnorm(n = 500, 4, 0.3) sb <- c(b, s) hist(sb, breaks = 100)