0

I have a dataframe df with x.number and y.size. I am trying to fit a custom MLL function with aa, K, Ka, q, c with standard deviation "sigma". I have been able to find the estimates, but how do I plot the actual function while incorporating the sigma along with a 95% confidence interval?

y.size <- c(2.69,4.1,8.04,3.1,5.27,5.033333333,3.2,7.25,6.29,4.55,6.1,2.65,3.145,3.775,3.46,5.73,5.31,4.425,3.725,4.32,5,3.09,5.25,5.65,3.48,6.1,10,9.666666667,6.06,5.9,2.665,4.32,3.816666667,3.69,5.8,5,3.72,3.045,4.485,3.642857143,5.5,6.333333333,4.75,6,7.466666667,5.03,5.23,4.85,5.59,5.96,5.33,4.92,4.255555556,6.346666667,4.13,6.33,4,7.35,6.35,4.63,5.13,7.4,4.28,4.233333333,4.3125,6.18,4.3,4.47,4.88,4.5,2.96,2.1,3.7,3.62,5.42,3.8,5.5,3.27,3.36,3.266666667,2.265,3.1,2.51,2.51,4.4,2.64,4.38,4.53,2.29,2.87,3.395,3.26,2.77,3.22,4.31,4.73,4.05,3.48,4.8,4.7,3.05,4.21,5.95,4.39,4.55,4.27,4.955,4.65,3.32,3.48,3.828571429,4.69,4.68,3.76,3.91,4,4.41,4.19,4.733333333,4.32,2.83,3.41,4.42,3.47,3.84,4.39)

x.number <- c(69,62,8,80,13,12,2,22,19,49,840,44,31,56,33,58,91,8,15,86,11,69,12,24,32,27,1,4,26,4,28,33,1516,41,20,58,44,29,58,14,3,3,6,3,26,52,26,29,92,30,18,11,27,19,38,78,57,52,17,45,56,7,37,7,14,13,164,76,82,14,273,122,662,434,126,374,1017,522,374,602,164,5,191,243,134,70,23,130,306,516,414,236,172,164,92,53,50,17,22,27,92,48,30,55,28,296,35,12,350,17,22,53,97,62,92,272,242,170,37,220,452,270,392,314,150,232)
df <- data.frame(x.number, y.size)
df <- df[df$x.number < 750,]

aa = -0.09 ; K = 100; Ka = 2; q = -4.5; sigma = 0.1; c = 2.5

skewfun <- function(aa, K, Ka, q, sigma,c){
  p <- x.number / K
  lnqp <- if (q == 0) log(p) else (p^q - 1) / q
  y.pred <- (aa * (p * K / Ka - 1) - 1) * lnqp + c
  ll <-   -sum(dnorm(y.size, mean = y.pred, sd = sigma, log=TRUE ))
  ll
}

mle2.model <- mle(skewfun, start = list(aa = -0.09, K = 200, Ka = 2, q= -4.5, sigma = 0.1, c=2.5))
summary(mle2.model)
-logLik(mle2.model)
AIC(mle2.model)


#Trying CI. I tried finding confidence intervals by profiling first and the the CI function as follows
p0 <- profile(mle2.model) 
#I get an error that says Error in onestep(step) : 
 profiling has found a better solution, so original fit had not converged
the next step according to cran handbook is confint(p0) .. but alas!!


#Plot with estimates

aa = -0.16 ; K = 189; Ka = -108; q = 0.015; sigma = 1.16; c = 3.52

ggplot(data=df,aes(x=x.number,y=y.size))+ geom_point(shape=21, fill="white", color="blue", size=3)+ stat_function(fun=function (x.number){p <- x.number / K
  lnqp <- if (q == 0) log(p) else (p^q - 1) / q
  y.pred <- (aa * (p * K / Ka - 1) - 1) * lnqp + c}, color = "blue") + ylim(0,10)

Currently my plot only has the raw function with estimates -- no sigma or 95% CI band enter image description here

Rspacer
  • 2,369
  • 1
  • 14
  • 40
  • It looks like your problem should be doable with `nls` (nonlinear least squares). Would an answer using `nls` be acceptable or will you be extending the model in ways that require `mle` in the future (or did I miss something)? – Ben Bolker May 03 '21 at 20:23
  • I have mostly been using mles to compare several model fits: linear, exponential and a Gompertz-Allee curve (as indicated in the problem). I don't see how using nls would be problem (as I am not worried about speed of calculation etc ) – Rspacer May 03 '21 at 20:27
  • I'm having a lot of trouble replicating this atm. Primary advice is: bootstrap. e.g. https://stackoverflow.com/questions/67021669/calculate-and-plot-95-confidence-intervals-of-a-generalised-nonlinear-model/67067377#67067377 – Ben Bolker May 03 '21 at 23:51
  • @BenBolker Okay thanks! I'll take a stab at it. I rechecked my code and I'm able to run it fine. It's possible that some R version may pickup the "c" parameter as concatenate--so perhaps a different variable? – Rspacer May 04 '21 at 00:19

0 Answers0