[R] How to find inverse of glm model?
Andrew Robinson
@pro @end|ng |rom un|me|b@edu@@u
Tue Apr 15 23:09:41 CEST 2025
A statistical (off-topic!) point to consider: when the GLM was fitted, you conditioned on x and let y be the random variable. Therefore the model supports predictions of y conditional on x. You’re now seeking to make predictions of x conditional on y. That’s not the same thing, even in OLS.
It might not matter for your application but it’s probably worth thinking about. Simulation experiments might shed some light on that.
Cheers, Andrew
--
Andrew Robinson
Chief Executive Officer, CEBRA and Professor of Biosecurity,
School/s of BioSciences and Mathematics & Statistics
University of Melbourne, VIC 3010 Australia
Tel: (+61) 0403 138 955
Email: apro using unimelb.edu.au
Website: https://researchers.ms.unimelb.edu.au/~apro@unimelb/
I acknowledge the Traditional Owners of the land I inhabit, and pay my respects to their Elders.
On 16 Apr 2025 at 1:01 AM +1000, Gregg Powell via R-help <r-help using r-project.org<mailto:r-help using r-project.org>>, wrote:
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.luigi using 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 using 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.
[[alternative HTML version deleted]]
More information about the R-help
mailing list