Take a look at this Luigi...

># The model is: logit(p) = β₀ + β₁*Cycles
># Where p is the probability (or normalized value in your case)
>
># The inverse function would be: Cycles = (logit⁻¹(p) - β₀)/β₁
># Where logit⁻¹ is the inverse logit function (also called the expit >function)
>
># Extract coefficients from your model
>intercept <- coef(b_model)[1]
>slope <- coef(b_model)[2]
>
># Define the inverse function
>inverse_predict <- function(p) {
>  # p is the probability or normalized value you want to find the >cycles for
>  # Inverse logit: log(p/(1-p)) which is the logit function
>  logit_p <- log(p/(1-p))
>  

>  # Solve for Cycles: (logit(p) - intercept)/slope
>  cycles <- (logit_p - intercept)/slope
>  

>  return(cycles)
>}
>
># Example: What cycle would give a normalized value of 0.5?
>inverse_predict(0.5)


This function takes a probability (normalized value between 0 and 1) and 
returns the cycle value that would produce this probability according to your 
model.
Also:
This works because GLM with binomial family uses the logit link function by 
default
The inverse function will return values outside your original data range if 
needed
This won't work for p=0 or p=1 exactly (you'd get -Inf or Inf), so you might 
want to add checks

All the best,
Gregg









On Tuesday, April 15th, 2025 at 5:57 AM, Luigi Marongiu 
<marongiu.lu...@gmail.com> wrote:

> 

> 

> I have fitted a glm model to some data; how can I find the inverse
> function of this model? Since I don't know the y=f(x) implemented by
> glm (this works under the hood), I can't define a f⁻¹(y).
> Is there an R function that can find the inverse of a glm model?
> Thank you.
> 

> The working example is:
> `V = c(120.64, 66.14, 34.87, 27.11, 8.87, -5.8, 4.52, -7.16, -17.39, -14.29, 
> -20.26, -14.99, -21.05, -20.64, -8.03, -21.56, -1.28, 15.01, 75.26, 191.76, 
> 455.09, 985.96, 1825.59, 2908.08, 3993.18, 5059.94, 6071.93, 6986.32, 
> 7796.01, 8502.25, 9111.46, 9638.01, 10077.19, 10452.02, 10751.81, 11017.49, 
> 11240.37, 11427.47, 11570.07, 11684.96, 11781.77, 11863.35, 11927.44, 
> 11980.81, 12021.88, 12058.35, 12100.63, 12133.57, 12148.89, 12137.09) df = 
> data.frame(Cycles = 1:35, Values = V[1:35]) M = max(df$Values) df$Norm = 
> df$Values/M df$Norm[df$Norm<0] = 0 b_model = glm(Norm ~ Cycles, data=df, 
> family=binomial) plot(Norm ~ Cycles, df, main="Normalized view", 
> xlab=expression(bold("Time")), ylab=expression(bold("Signal (normalized)")), 
> type="p", col="cyan") lines(b_model$fitted.values ~ df$Cycles, col="blue", 
> lwd=2)`
> 

> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

Attachment: signature.asc
Description: OpenPGP digital signature

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to