Search code examples
gammgcv

Log transformed data in GAM, how to plot response?


I used log-transformed data (dependent varibale=count) in my generalised additive model (using mgcv) and tried to plot the response by using "trans=plogis" as for logistic GAMs but the results don't seem right. Am I forgetting something here? When I used linear models for my data first, I plotted the least-square means. Any idea how I could plot the output of my GAMs in a more interpretable way other than on the log scale?

Cheers


Solution

  • Are you running a logistic regression for count data? Logistic regression is normally a binary variable or a proportion of binary outcomes.

    That being said, the real question here is that you want to backtransform a variable that was fit on the log scale back to the original scale for plotting. That can be easily done using the itsadug package. I've simulated some silly data here just to show the code required.

    With itsadug, you can visually inspect many aspects of GAM models. I'd encourage you to look at this: https://cran.r-project.org/web/packages/itsadug/vignettes/inspect.html

    The transform argument of plot_smooth() can also be used with custom functions written in R. This can be useful if you have both centred and logged a dependent variable.

    library(mgcv)
    library(itsadug)
    
    # Setting seed so it's reproducible
    set.seed(123)
    
    # Generating 50 samples from a uniform distribution
    x <- runif(50, min = 20, max = 50)
    
    # Taking the sin of x to create a dependent variable
    y <- sin(x) 
    
    # Binding them to a dataframe
    d <- data.frame(x, y)
    
    # Logging the dependent variable after adding a constant to prevent negative values
    d$log_y <- log(d$y + 1)
    
    # Fitting a GAM to the transformed dependent variable
    model_fit <- gam(log_y ~ s(x),
                     data = d)
    
    # Using the plot_smooth function from itsadug to backtransform to original y scale
    plot_smooth(model_fit,
                view = "x",
                transform = exp)