使用 R 找到适合曲线族的最佳曲线

find the best curve to fit a family of curves using R

我有一个进程在每个 运行 处生成一组数字 (< 1)。这个过程是 运行 直到生成的数字的累积和等于 1。所以每个集合可能有不同的生成数字计数。但是每组的总和是1.

进程数以千计运行。我可以用数字的总和绘制 运行s,有多条曲线,每条曲线对应一个 运行。

50 运行 秒:

对于 2000 运行 秒:

如您所见,曲线具有确定的形状,而不是随机输出。我想找到最适合这组曲线的方程。

我如何在 R 中执行此操作?大多数最佳拟合曲线解决方案都是针对一组数据进行拟合的。

这里是用 5 运行s 生成示例数据的代码。

run_group <- 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 <- 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 <- 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 <- data.frame(run_group, cumul, time_diff_to_complete, stringsAsFactors=FALSE)

把它们叠起来。曲线看起来像高斯 cdf,所以我们适合 pnorm。 (逻辑 cdf plogis 也可能有效。)

x <- sample_data$time_diff_to_complete
o <- order(x) 
st <- list(a = mean(x), b = sd(x))

fm <- 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, ])

合身看起来像这样: