#r #model #curve-fitting #curve #nls
Вопрос:
У меня есть процесс, который генерирует набор чисел ( процесс выполняется до тех пор, пока совокупная сумма сгенерированных чисел не станет равной 1. Таким образом, каждый набор может иметь разное количество сгенерированных чисел. Но общая сумма каждого набора равна 1.
Существует тысячи запусков этого процесса. Я могу построить пробеги с суммой чисел, есть несколько кривых, каждая кривая соответствует пробегу.
Как вы можете видеть, кривые имеют определенную форму и не являются случайным результатом. Я хочу найти наиболее подходящее уравнение для этой группы кривых.
Как я могу сделать это в R? Большинство решений для кривых наилучшего соответствия предназначены для сопоставления с одним набором данных.
вот код для создания образцов данных с 5 запусками.
run_group lt;- c('A_group', 'A_group', 'A_group', 'A_group', 'A_group', 'A_group', 'A_group', 'A_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'B_group', 'C_group', 'C_group', 'C_group', 'C_group', 'C_group', 'C_group', 'C_group', 'D_group', 'D_group', 'D_group', 'D_group', 'D_group', 'D_group', 'D_group', 'D_group', 'D_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group', 'E_group') cumul lt;- c(0.052631579, 0.263157895, 0.342105263, 0.710526316, 0.868421053, 0.894736842, 0.973684211, 1, 0.0078125, 0.015625, 0.0390625, 0.0546875, 0.0703125, 0.1015625, 0.1640625, 0.3203125, 0.4921875, 0.734375, 0.875, 0.96875, 0.9921875, 1, 0.073529412, 0.220588235, 0.323529412, 0.507352941, 0.727941176, 0.970588235, 1, 0.006134969, 0.055214724, 0.141104294, 0.190184049, 0.349693252, 0.595092025, 0.858895706, 0.969325153, 1, 0.005649718, 0.011299435, 0.016949153, 0.039548023, 0.073446328, 0.124293785, 0.299435028, 0.451977401, 0.559322034, 0.728813559, 0.81920904, 0.960451977, 1) time_diff_to_complete lt;- c(-155, -140, -125, -110, -95, -80, -65, -50, -270, -210, -195, -180, -165, -150, -135, -120, -105, -90, -75, -60, -45, -30, -130, -115, -100, -85, -70, -55, -40, -175, -160, -130, -115, -100, -85, -70, -55, -40, -225, -210, -195, -180, -150, -135, -120, -105, -90, -75, -60, -45, -30) sample_data lt;- data.frame(run_group, cumul, time_diff_to_complete, stringsAsFactors=FALSE)
Ответ №1:
Просто сложите их в стопку. Кривые выглядят как гауссовы cdf, поэтому мы подходим pnorm
. (Логистический cdf plogis
, вероятно , также будет работать.)
x lt;- sample_data$time_diff_to_complete o lt;- order(x) st lt;- list(a = mean(x), b = sd(x)) fm lt;- nls(cumul ~ pnorm(time_diff_to_complete, a, b), sample_data[o, ], start = st) plot(cumul ~ time_diff_to_complete, sample_data) lines(fitted(fm) ~ time_diff_to_complete, sample_data[o, ])
Подгонка выглядит так:
Комментарии:
1. Огромное спасибо. Я был слишком увлечен разделением запусков, так как мне нужно было сформировать кластеры выходных данных запуска. Но это уже другой вопрос.