У меня есть один набор данных, который я хочу откалибровать по другому. Что делает это сложным, так это то, что у меня нет полного дистрибутива, у меня есть данные подсчета. Я знаю, что распределение должно быть распределением Вейбулла, поэтому я создал 2 кривые Вейбулла, но тогда я не знаю, что делать, чтобы масштабировать одну по другой.
Набор данных, который я хочу откалибровать, выглядит следующим образом: у меня есть ячейки, счетчики в каждой ячейке и понимание того, к чему относятся ячейки в реальном мире (x). Откалиброванные данные — это лазер, и я хочу посмотреть, как те же самые события, измеренные в акустическом сигнале, совпадают с лазером.
calibrated.data <- data.frame(bins=1:30,
counts=c(39317, 127633, 168713, 169734, 136713, 92202, 66831,
52198, 57662, 25492, 13085, 6824, 3174, 1789, 247,
36, 2, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0),
x=c(0.312, 0.437, 0.562, 0.687, 0.812, 0.937, 1.062, 1.187,
1.375, 1.625, 1.875, 2.125, 2.375, 2.75, 3.25, 3.75, 4.25,
4.75, 5.5, 6.5, 7.5, 8.5, 9.5, 11, 13, 15, 17, 19, 21.5,
24.5))
Данные, которые я хочу откалибровать, имеют только подсчет. Бункеры не отображают 1:1.
new.data <- data.frame(bins=c(1:32,
counts=c(13877, 12874, 12217, 11555, 10834, 10220, 9274, 8381, 7414,
6777, 6069, 5272, 4762, 4077, 3607, 3059, 2672, 2173, 1856,
1475, 1139, 815, 596, 417, 264, 186, 103, 62, 40, 20, 8, 15))
Зная, что в конечном счете данные следуют за Вейбуллом, я построил кривую Вейбулла, делающую
weib.curve <- function(x, shape, scale, c){
c * ((x/shape)^(scale-1)) * exp(-(x/shape)^scale)
}
Затем следует параметризация (мне просто нравится подгонка nls).
weib.coef.A <- with(calibrated.data,
coef(nls(counts ~ weib.curve(bins, shape, scale,c),
start=list(shape=3.9, scale=-1.5, c=sum(counts)),
control=list(maxiter=100))))
weib.coef.new <- with(new.data,
coef(nls(counts ~ weib.curve(1:32, shape, scale,c),
start=list(shape=3.9, scale=-1.5, c=sum(counts)),
control=list(maxiter=100))))
Итак, теперь у меня есть коэффициенты для двух кривых Вейбулла, но я не знаю, как масштабировать кривую new.data, чтобы она соответствовала калиброванным данным, чтобы я мог сопоставить новые ячейки данных с реальным x.
Если бы я работал с необработанными данными, я знаю, что мог бы сделать что-то вроде Изменение распределения одного набора данных для соответствия другому набору данных Но я не знаю, как это сделать с кривыми распределения.
В конечном итоге я хочу двоякого:
- Уравнение, которое позволяет мне моделировать откалиброванные данные (количество ~ x) на основе ввода new.data
- Отображение того, как бины в new.data будут равны x.
new.data — это, по сути, уплощенная версия калиброванного.data. На рисунке выше я вижу, что мне нужно увеличить амплитуду счетчиков new.data$ при сжатии контейнеров new.data$ для наложения кривых.