Power regression in R similar to excel

后端 未结 3 1151
天涯浪人
天涯浪人 2020-12-14 12:05

I have a simple dataset and I am trying to use the power trend to best fit the data. The sample data is very small and is as follows:

structure(list(Discharg         


        
相关标签:
3条回答
  • 2020-12-14 12:22

    While mnel's answer is correct for a nonlinear least squares fit, note that Excel isn't actually doing anything nearly that sophisticated. It's really just log-transforming the response and predictor variables, and doing an ordinary (linear) least squares fit. To reproduce this in R, you would do:

    lm(log(Age) ~ log(Discharge), data=df)
    
    Call:
    lm(formula = log(Age) ~ log(Discharge), data = df)
    
    Coefficients:
       (Intercept)  log(Discharge)  
             5.927          -1.024  
    

    As a check, the coefficient for log(Discharge) is identical to that from Excel while exp(5.927) ~ 375.05.

    While I'm not sure how to use this as a trendline in ggplot2, you can do it in base graphics thusly:

    m <- lm(log(y) ~ log(x), data=df)
    
    newdf <- data.frame(Discharge=seq(min(df$Discharge), max(df$Discharge), len=100))
    plot(Age ~ Discharge, data=df)
    lines(newdf$Discharge, exp(predict(m, newdf)))
    
    text(600, .8, substitute(b0*x^b1, list(b0=exp(coef(m)[1]), b1=coef(m)[2])))
    text(600, .75, substitute(plain("R-square: ") * r2, list(r2=summary(m)$r.squared)))
    
    0 讨论(0)
  • 2020-12-14 12:34

    2018 Update: The call "start" now seems to be depreciated. It is not in the stat_smooth function information either.

    If you want to choose starting values, you need to use "method.args" option now.

    See changes below:

    ggplot(DD,aes(x = Discharge,y = Age)) +
      geom_point() + 
      stat_smooth(method = 'nls', formula = 'y~a*x^b', method.args = list(start= c(a = 1,b=1)),se=FALSE) + geom_text(x = 600, y = 1, label = power_eqn(DD), parse = TRUE)
    
    0 讨论(0)
  • 2020-12-14 12:42

    Use nls (nonlinear least squares) as your smoother

    eg

    ggplot(DD,aes(x = Discharge,y = Age)) +
      geom_point() + 
      stat_smooth(method = 'nls', formula = 'y~a*x^b', start = list(a = 1,b=1),se=FALSE)
    

    Noting Doug Bates comments on R-squared values and non-linear models here, you could use the ideas in Adding Regression Line Equation and R2 on graph

    to append the regression line equation

    # note that you have to give it sensible starting values
    # and I haven't worked out why the values passed to geom_smooth work!
    power_eqn = function(df, start = list(a =300,b=1)){
      m = nls(Discharge ~ a*Age^b, start = start, data = df);
      eq <- substitute(italic(y) == a  ~italic(x)^b, 
                   list(a = format(coef(m)[1], digits = 2), 
                        b = format(coef(m)[2], digits = 2)))
      as.character(as.expression(eq));                 
    }
    
    ggplot(DD,aes(x = Discharge,y = Age)) +
      geom_point() + 
      stat_smooth(method = 'nls', formula = 'y~a*x^b', start = list(a = 1,b=1),se=FALSE) +  
      geom_text(x = 600, y = 1, label = power_eqn(DD), parse = TRUE)
    
    0 讨论(0)
提交回复
热议问题