I wonder if you're a bit mistrustful of the output of nls
, thinking that perhaps you could find a better fit yourself?
Here's a way to at least give you a better feel for the fit created by different values of a
and b
. The idea is that we create a plot with all the values of a
on the x axis, and all the values of b
on the y axis. For each pair of a
and b
we work out how close the resulting curve would be to our data (by taking the log sum of squares). If the fit is good, we colour it with a bright colour, and if the fit is bad we colour it with a darker colour. This allows us to see the types of combinations that will make good fits - effectively a heat map of the parameters.
# Our actual data, put in a data frame:
df <- data.frame(x = c(52.67, 46.80, 41.74, 40.45), y = c(1.73, 1.84, 1.79, 1.45))
# Create a grid of all a and b values we want to compare
a <- seq(-5, 10, length.out = 200)
b <- seq(0, 0.5, length.out = 100)
all_mixtures <- setNames(expand.grid(a, b), c("a", "b"))
# Get the sum of squares for each point:
all_mixtures$ss <- apply(all_mixtures, 1, function(i) {
log(sum((i[1] * i[2] * df$x / (1 + i[2] * df$x) - y)^2))
})
Now we plot the heatmap:
p <- ggplot(all_mixtures, aes(a, b, fill = ss)) +
geom_tile() +
scale_fill_gradientn(colours = c("white", "yellow", "red", "blue"))
p

Clearly, the optimum pair of a
and b
lie somewhere on the white line.
Now let's see where the nls
thought the best combination of a
and b
was:
p + geom_point(aes(x= 2.8312323, y = 0.0334379), size = 5)

It looks as though it has found the optimum just at the "bend" of the white line, which is probably what you have guessed.
It looks like if you stray outside this white line, your fit will be worse, and you're not going to find anywhere on the white line that's better.
Trust the nls
. Yes, the fit doesn't look very good, but that's simply because the data don't fit this particular formula very well, however you set its parameters. If your model has to be in this form, and these are your data, this is the best fit you are going to get.