[R] Failure in predicting parameters

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Thu Mar 18 21:46:40 CET 2021


Hello,

Maybe a bit late but there is a contributed package [1] for quantitative 
PCR fitting non-linear models with the Levenberg-Marquardt algorithm.

estim and vector R below are your model and your fitted values vector. 
The RMSE of this fit is smaller than your model's.


Isn't this simpler?


library(qpcR)

df1 <- data.frame(Cycles = seq_along(high), high)

fit <- pcrfit(
   data = df1,
   cyc = 1,
   fluo = 2
)
summary(fit)

coef(estim)
coef(fit)


sqrt(sum(resid(estim)^2))
#[1] 1724.768
sqrt(sum(resid(fit)^2))
#[1] 1178.318


highpred <- predict(fit, newdata = df1)

plot(1:45, high, type = "l", col = "red")
points(1:45, R, col = "blue")
points(1:45, highpred$Prediction, col = "cyan", pch = 3)


[1] https://CRAN.R-project.org/package=qpcR

Hope this helps,

Rui Barradas

Às 06:51 de 18/03/21, Luigi Marongiu escreveu:
> It worked. I re-written the equation as:
> ```
> rutledge_param <- function(p, x, y) ( (p$M / ( 1 + exp(-(x-p$m)/p$s))
> ) + p$B ) - y
> ```
> and used Desmos to estimate the slope, so:
> ```
> estim <- nls.lm(par = list(m = halfCycle, s = 2.77, M = MaxFluo, B = high[1]),
>              fn = rutledge_param, x = 1:45, y = high)
> summary(estim)
> R <- rutledge(list(half_fluorescence = 27.1102, slope = 2.7680,
>                     max_fluorescence = 11839.7745, back_fluorescence =
> -138.8615) , 1:45)
> points(1:45, R, type="l", col="red")
> ```
> 
> Thanks
> 
> On Tue, Mar 16, 2021 at 8:29 AM Luigi Marongiu <marongiu.luigi using gmail.com> wrote:
>>
>> Just an update:
>> I tried with desmos and the fitting looks good. Desmos calculated the
>> parameters as:
>> Fmax = 11839.8
>> Chalf = 27.1102 (with matches with my estimate of 27 cycles)
>> k = 2.76798
>> Fb = -138.864
>> I forced R to accept the right parameters using a single named list
>> and re-written the formula (it was a bit unclear in the paper):
>> ```
>> rutledge <- function(p, x) {
>>    m = p$half_fluorescence
>>    s = p$slope
>>    M = p$max_fluorescence
>>    B = p$back_fluorescence
>>    y = (M / (1+exp( -((x-m)/s) )) ) + B
>>    return(y)
>> }
>> ```
>> but when I apply it I get a funny graph:
>> ```
>> desmos <- rutledge(list(half_fluorescence = 27.1102, slope = 2.76798,
>>                          max_fluorescence = 11839.8, back_fluorescence
>> = -138.864) , high)
>> ```
>>
>> On Mon, Mar 15, 2021 at 7:39 AM Luigi Marongiu <marongiu.luigi using gmail.com> wrote:
>>>
>>> Hello,
>>> the negative data comes from the machine. Probably I should use raw
>>> data directly, although in the paper this requirement is not reported.
>>> The p$x was a typo. Now I corrected it and I got this error:
>>> ```
>>>
>>>> rutledge_param <- function(p, x, y) ((p$M / (1 + exp(-1*(x-p$m)/p$s))) + p$B) - y
>>>> estim <- nls.lm(par = list(m = halfFluo, s = slopes, M = MaxFluo, B = high[1]),
>>> +             fn = rutledge_param, x = 1:45, y = high)
>>> Error in dimnames(x) <- dn :
>>>    length of 'dimnames' [2] not equal to array extent
>>> ```
>>> Probably because 'slopes' is a vector instead of a scalar. Since the
>>> slope is changing, I don't think is right to use a scalar, but I tried
>>> and I got:
>>> ```
>>>> estim <- nls.lm(par = list(m = halfFluo, s = 1, M = MaxFluo, B = high[1]),
>>> +             fn = rutledge_param, x = 1:45, y = high)
>>>> estim
>>> Nonlinear regression via the Levenberg-Marquardt algorithm
>>> parameter estimates: 6010.94, 1, 12021.88, 4700.49288888889
>>> residual sum-of-squares: 1.14e+09
>>> reason terminated: Relative error in the sum of squares is at most `ftol'.
>>> ```
>>> The values reported are the same I used at the beginning apart from
>>> the last (the background parameter) which is 4700 instead of zero. If
>>> I plug it, I get an L shaped plot that is worse than that at the
>>> beginning:
>>> ```
>>> after = init = rutledge(halfFluo, 1, MaxFluo, 4700.49288888889, high)
>>> points(1:45, after, type="l", col="blue")
>>> ```
>>> What did I get wrong here?
>>> Thanks
>>>
>>> On Sun, Mar 14, 2021 at 8:05 PM Bill Dunlap <williamwdunlap using gmail.com> wrote:
>>>>
>>>>> rutledge_param <- function(p, x, y) ((p$M / (1 + exp(-1*(p$x-p$m)/p$s))) + p$B) - y
>>>>
>>>> Did you mean that p$x to be just x?  As is, this returns numeric(0)
>>>> for the p that nls.lm gives it because p$x is NULL and NULL-aNumber is
>>>> numeric().
>>>>
>>>> -Bill
>>>>
>>>> On Sun, Mar 14, 2021 at 9:46 AM Luigi Marongiu <marongiu.luigi using gmail.com> wrote:
>>>>>
>>>>> Hello,
>>>>> I would like to use the Rutledge equation
>>>>> (https://pubmed.ncbi.nlm.nih.gov/15601990/) to model PCR data. The
>>>>> equation is:
>>>>> Fc = Fmax / (1+exp(-(C-Chalf)/k)) + Fb
>>>>> I defined the equation and another that subtracts the values from the
>>>>> expectations. I used minpack.lm to get the parameters, but I got an
>>>>> error:
>>>>> ```
>>>>>
>>>>>> library("minpack.lm")
>>>>>> h <- 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)
>>>>>> high <- h[1:45]
>>>>>> MaxFluo <- max(high)
>>>>>> halfFluo <- MaxFluo/2
>>>>>> halfCycle = 27
>>>>>> find_slope <- function(X, Y) {
>>>>> +   Slope <- c(0)
>>>>> +   for (i in 2:length(X)) {
>>>>> +     delta_x <- X[i] - X[i-1]
>>>>> +     delta_y <- Y[i] - Y[i-1]
>>>>> +     Slope[i] <- delta_y/delta_x
>>>>> +   }
>>>>> +   return(Slope)
>>>>> + }
>>>>>> slopes <- find_slope(1:45, high)
>>>>>>
>>>>>> rutledge <- function(m, s, M, B, x) {
>>>>> +   divisor = 1 + exp(-1* ((x-m)/s) )
>>>>> +   y = (M/divisor) + B
>>>>> +   return(y)
>>>>> + }
>>>>>> rutledge_param <- function(p, x, y) ((p$M / (1 + exp(-1*(p$x-p$m)/p$s))) + p$B) - y
>>>>>>
>>>>>>
>>>>>> init = rutledge(halfFluo, slopes, MaxFluo, 0, high)
>>>>>> points(1:45, init, type="l", col="red")
>>>>>> estim <- nls.lm(par = list(m = halfFluo, s = slopes, M = MaxFluo, B = high[1]),
>>>>> +                 fn = rutledge_param, x = 1:45, y = high)
>>>>> Error in nls.lm(par = list(m = halfFluo, s = slopes, M = MaxFluo, B =
>>>>> high[1]),  :
>>>>>    evaluation of fn function returns non-sensible value!
>>>>> ```
>>>>>
>>>>> Where could the error be?
>>>>>
>>>>>
>>>>> --
>>>>> Best regards,
>>>>> Luigi
>>>>>
>>>>> ______________________________________________
>>>>> 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 http://www.R-project.org/posting-guide.html
>>>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Luigi
>>
>>
>>
>> --
>> Best regards,
>> Luigi
> 
> 
>



More information about the R-help mailing list