Вот несколько идей в R:
Во-первых, я делаю некоторые примеры данных, которые похожи на ваши, и подгоняю линейную модель с x ^ 3, x ^ 2 и x в качестве предикторов:
# make example data
xx = rep(c(30, 50, 70, 100), each = 10)
yy = 1/(1+exp(-(xx-50)/15)) * 4798.20 + rnorm(length(xx), sd = 20)
xx = c(0, xx)
yy = c(0, yy)
# fit third-order linear model
m0 = lm(yy ~ I(xx^3) + I(xx^2) + xx)
x_to_predict = data.frame(xx = seq(0, 100, length.out = length(xx)))
lm_preds = predict(m0, newdata = x_to_predict)
Идея 1: Вы можете подобрать модель, которая использует сигмовидную (или другую монотонную) кривую.
# fit quasibinomial model for proportion
# first scale response variable between 0 and 1
m1 = glm(I(yy/max(yy)) ~ xx , family = quasibinomial())
# predict
preds_glm = predict(m1,
newdata = x_to_predict,
type = "response")
Идея 2: Подберите обобщенную аддитивную модель, которая сделает плавную кривую.
# fit Generalized Additive Model
library(mgcv)
# you have to tune "k" somewhat -- larger means more "wiggliness"
m2 = gam(yy ~ s(xx, k = 4))
gam_preds = predict(m2,
newdata = x_to_predict,
type = "response")
Вот как выглядят графики для каждой модели:
# plot data and predictions
plot(xx, yy, ylab = "result", xlab = "efficiency")
lines(x_to_predict$xx,
preds_glm*max(yy), "l", col = 'red', lwd = 2)
lines(x_to_predict$xx,
gam_preds, "l", col = 'blue', lwd = 2)
lines(x_to_predict$xx, lm_preds,
"l", col = 'black', lwd = 2, lty = 2)
legend("bottomright",
lty = c(0, 1, 1, 2),
legend = c("data", "GLM prediction", "GAM prediction", "third-order lm"),
pch = c(1, NA_integer_, NA_integer_, NA_integer_),
col = c("black", "red", "blue", "black"))