How to coerce a parameter in nls?
Hello, Gabor,
Thanks again for your suggestion. And now I am trying to improve the
code by adding a function to replace the express "Rm1 * ref.1 + Rm2 *
ref.2 + Rm3 * ref.3 + Rm4 * ref.4 + Rm5 * ref.5 + Rm6 * ref.6" because
I have some other dataset need to fitted to the same model but with
more groups (>20).
I tried to add the function as:
denfun<-function(i){
for(i in 1:6){
Rm<-sum(Rm[i]*ref.i)
return(Rm)}
}
but I got another error when I incorporate this function into my regression:
fitdp1<-nlxb(den ~ denfun(6)/(1+(depth/d50)^c),
data = dproot2,
start = c(Rm1=1.01, Rm2=1.01, Rm3=1.01, Rm4=6.65,
Rm5=1.01, Rm6=1, d50=20, c=-1),
masked = "Rm6")
Error in deriv.default(parse(text = resexp), names(start)) :
Function 'denfun' is not in the derivatives table
I think there must be something wrong with my function. I tried some
times but am not sure how to improve it because I am quite new to R.
Could anyone please give me some suggestion.
Thanks a lot!
Jianling
On 22 September 2015 at 00:43, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
Express the formula in terms of simple operations like this:
# add 0/1 columns ref.1, ref.2, ..., ref.6
dproot2 <- do.call(data.frame, transform(dproot, ref = outer(dproot$ref,
seq(6), "==") + 0))
# now express the formula in terms of the new columns
library(nlmrt)
fitdp1<-nlxb(den ~ (Rm1 * ref.1 + Rm2 * ref.2 + Rm3 * ref.3 + Rm4 * ref.4 +
Rm5 * ref.5 + Rm6 * ref.6)/(1+(depth/d50)^c),
data = dproot2,
start = c(Rm1=1.01, Rm2=1.01, Rm3=1.01, Rm4=6.65, Rm5=1.01, Rm6=1,
d50=20, c=-1),
masked = "Rm6")
where we used this input:
Lines <- " depth den ref
1 20 0.5730000 1
2 40 0.7800000 1
3 60 0.9470000 1
4 80 0.9900000 1
5 100 1.0000000 1
6 10 0.6000000 2
7 20 0.8200000 2
8 30 0.9300000 2
9 40 1.0000000 2
10 20 0.4800000 3
11 40 0.7340000 3
12 60 0.9610000 3
13 80 0.9980000 3
14 100 1.0000000 3
15 20 3.2083491 4
16 40 4.9683383 4
17 60 6.2381133 4
18 80 6.5322348 4
19 100 6.5780660 4
20 120 6.6032064 4
21 20 0.6140000 5
22 40 0.8270000 5
23 60 0.9500000 5
24 80 0.9950000 5
25 100 1.0000000 5
26 20 0.4345774 6
27 40 0.6654726 6
28 60 0.8480684 6
29 80 0.9268951 6
30 100 0.9723207 6
31 120 0.9939966 6
32 140 0.9992400 6"
dproot <- read.table(text = Lines, header = TRUE)
On Mon, Sep 21, 2015 at 12:22 PM, Jianling Fan <fanjianling at gmail.com>
wrote:
Thanks Prof. Nash, Sorry for late reply. I am learning and trying to use your nlmrt package since I got your email. It works good to mask a parameter in regression but seems does work for my equation. I think the problem is that the parameter I want to mask is a group-specific parameter and I have a "[]" syntax in my equation. However, I don't have your 2014 book on hand and couldn't find it in our library. So I am wondering if nlxb works for group data? Thanks a lot! following is my code and I got a error form it.
fitdp1<-nlxb(den~Rm[ref]/(1+(depth/d50)^c),data=dproot,
+ start =c(Rm1=1.01, Rm2=1.01, Rm3=1.01, Rm4=6.65,
Rm5=1.01, Rm6=1, d50=20, c=-1),
+ masked=c("Rm6"))
Error in deriv.default(parse(text = resexp), names(start)) :
Function '`[`' is not in the derivatives table
Best regards,
Jianling
On 20 September 2015 at 12:56, ProfJCNash <profjcnash at gmail.com> wrote:
I posted a suggestion to use nlmrt package (function nlxb to be precise), which has masked (fixed) parameters. Examples in my 2014 book on Nonlinear parameter optimization with R tools. However, I'm travelling just now, or would consider giving this a try. JN On 15-09-20 01:19 PM, Jianling Fan wrote:
no, I am doing a regression with 6 group data with 2 shared parameters and 1 different parameter for each group data. the parameter I want to coerce is for one group. I don't know how to do it. Any suggestion? Thanks! On 19 September 2015 at 13:33, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:
Why not rewrite the function so that value is not a parameter?
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go
Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live
Go...
Live: OO#.. Dead: OO#..
Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#.
rocks...1k
---------------------------------------------------------------------------
Sent from my phone. Please excuse my brevity.
On September 18, 2015 9:54:54 PM PDT, Jianling Fan
<fanjianling at gmail.com> wrote:
Hello, everyone, I am using a nls regression with 6 groups data. I am trying to coerce a parameter to 1 by using a upper and lower statement. but I always get an error like below: Error in ifelse(internalPars < upper, 1, -1) : (list) object cannot be coerced to type 'double' does anyone know how to fix it? thanks in advance! My code is below:
dproot
depth den ref 1 20 0.5730000 1 2 40 0.7800000 1 3 60 0.9470000 1 4 80 0.9900000 1 5 100 1.0000000 1 6 10 0.6000000 2 7 20 0.8200000 2 8 30 0.9300000 2 9 40 1.0000000 2 10 20 0.4800000 3 11 40 0.7340000 3 12 60 0.9610000 3 13 80 0.9980000 3 14 100 1.0000000 3 15 20 3.2083491 4 16 40 4.9683383 4 17 60 6.2381133 4 18 80 6.5322348 4 19 100 6.5780660 4 20 120 6.6032064 4 21 20 0.6140000 5 22 40 0.8270000 5 23 60 0.9500000 5 24 80 0.9950000 5 25 100 1.0000000 5 26 20 0.4345774 6 27 40 0.6654726 6 28 60 0.8480684 6 29 80 0.9268951 6 30 100 0.9723207 6 31 120 0.9939966 6 32 140 0.9992400 6
fitdp<-nls(den~Rm[ref]/(1+(depth/d50)^c),data=dproot,
+ start = list(Rm=c(1.01, 1.01, 1.01, 6.65,1.01,1), d50=20, c=-1))
summary(fitdp)
Formula: den ~ Rm[ref]/(1 + (depth/d50)^c)
Parameters:
Estimate Std. Error t value Pr(>|t|)
Rm1 1.12560 0.07156 15.73 3.84e-14 ***
Rm2 1.57643 0.11722 13.45 1.14e-12 ***
Rm3 1.10697 0.07130 15.53 5.11e-14 ***
Rm4 7.23925 0.20788 34.83 < 2e-16 ***
Rm5 1.14516 0.07184 15.94 2.87e-14 ***
Rm6 1.03658 0.05664 18.30 1.33e-15 ***
d50 22.69426 1.03855 21.85 < 2e-16 ***
c -1.59796 0.15589 -10.25 3.02e-10 ***
---
Signif. codes: 0 ?**?0.001 ?*?0.01 ??0.05 ??0.1 ??1
Residual standard error: 0.1094 on 24 degrees of freedom
Number of iterations to convergence: 8
Achieved convergence tolerance: 9.374e-06
fitdp1<-nls(den~Rm[ref]/(1+(depth/d50)^c),data=dproot,
algorithm="port", + start = list(Rm=c(1.01, 1.01, 1.01, 6.65, 1.01, 1), d50=20, c=-1), + lower = list(Rm=c(1.01, 1.01, 1.01, 6.65, 1.01, 1), d50=20, c=-1), + upper = list(Rm=c(2.1, 2.2, 2.12, 12.5, 2.3, 1), d50=50, c=1)) Error in ifelse(internalPars < upper, 1, -1) : (list) object cannot be coerced to type 'double'
______________________________________________ R-help at 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.
______________________________________________ R-help at 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.
-- Jianling Fan ???
______________________________________________ R-help at 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.
-- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com
Jianling Fan ???