I think there are two issues here: First, logistic regression is appropriate when the outcome can be one of two categories which get dummy-coded as 0 or 1. In your case, the outcome is a proportion that can take on any real value between 0 and 1. I think beta regression is the appropriate method for such data (see, for example, the vignette for the betareg package:
https://cran.r-project.org/web/packages/betareg/vignettes/betareg.pdf).
Second, in cases where logistic regression is appropriate, a problem that can arise is called "perfect separation." This occurs when there is at least on independent variable that allows you to predict with 100% percent certainty whether the outcome is 0 or 1. In such cases, there is not a unique solution for the regression coefficients, and the standard error for the regression line essentially covers the full range between probabilities of 0 and 1. For example, if you run the code below you'll get a warnings about the fit not converging and that "fitted probabilities numerically 0 or 1 occurred," meaning there was perfect separation. Also, in the summary, note the huge standard errors on the coefficients.
df <- data.frame(x = c(83.3, 41.7, 20.8, 10.4, 5.2, 2.6, 1.3),
y = c(15, 15, 2, 0, 0, 0, 0),
total = c(15, 15, 15, 15, 15, 15, 15))
df$yt = df$y/df$total
m = glm(yt ~ x, weights=total, data=df, family=binomial)
summary(m)
The examples below use data appropriate for logistic regression and demonstrate cases where there is perfect separation and where there is overlap between the two possible outcomes:
# Perfect separation
set.seed(2)
df2 = data.frame(
x = c(runif(20,0,9), runif(20,11,20)),
y = rep(0:1, each=20)
)
ggplot(data = df2,
aes(x,y)) +
geom_point() +
geom_smooth(method = "glm",
method.args = list(family = binomial(link = "logit")))
# Outcomes overlap
set.seed(2)
df3 = data.frame(
x = c(runif(20,0,12), runif(20,8,20)),
y = rep(0:1, each=20)
)
ggplot(data = df3,
aes(x,y)) +
geom_point() +
geom_smooth(method = "glm",
method.args = list(family = binomial(link = "logit")))