Thank you a lot Mr. Ritz!
I've tried the loop you suggested and I added a list for lower and upper limits
of the parameters, but there is still
a problem...
I have a list of functions, which works...
fz1-function(Portata, a, b){a+(b/Portata)}
fz2-function(Portata, a, b){a*exp(b*Portata)}
fz3-function(Portata, a, b, d, e){a+(b/Portata)+d*(Portata^e)}
fz4-function(Portata, a, b){a*Portata^b}
fz5-function(Portata, a, b, d){a+b*(Portata^d)}
fctList - list(fz1, fz2, fz3, fz4, fz5)
as well as lists for starting values, upper and lower values, which work as
well:
startList - list(list(a=10, b=10), list(a=10, b=1), list(a=10, b=10, d=10,
e=1), list(a=10, b=1), list(a=10, b=10,
d=1))
lowerList-list(list(a=0,b=0),list(a=0,b=0), list(a=0,b=0,d=0,e=-50),list(a=0,
b=-50), list(a=0, b=0, d=-50))
upperList-list(list(a=1000, b=1000), list(a=1000, b=1000),
list(a=1000,b=1000,d=1000,e=50), list(a=1000,b=50), list
(a=1000, b=1000, d=50))
but if I try to run this for loop
resultList - list()
for (i in 1:5)
{
resultList[[i]] - nls(NT.N ~ fctList[[i]](Portata, a,b), data=subset(dati,
Fiume==Laveggio), start=startList[[i]],
nls.control(maxiter=200), algorithm='port', trace=TRUE, na.action=na.omit,
upper=upperList[[i]], lower=lowerList[[i]])
}
I get the following error message:
Error in fctList[[i]](Portata, a, b) : element 1 is empty;
the part of the args list of '*' being evaluated was:
(d, (Portata^e))
I realized that the problem is the element after the function, i.e. (Portata,
a, b), since fct 3 and 5 have more
parameters (Portata,a,b,d,e).
So I tried to make a list (parList) for this too, i tried 2 versions:
#version1
list(Portata,a, b)-pf1.2.4
list(Portata,a,b,d,e)-pf3
list(Portata,a,b,d)-pf5
parList-list(pf1.2.4, pf1.2.4,pf3,pf1.2.4,pf5)
#version 2
parList-list(Portata,a,b,Portata,a,b,Portata,a,b,d,e,
Portata,a,b,Portata,a,b,d)
and then I tried them (one at a time) in the loop:
resultList - list()
for (i in 1:5)
{
resultList[[i]] - nls(NT.N ~ fctList[[i]](parList[[i]]), data=subset(dati,
Fiume==Laveggio), start=startList
[[i]], nls.control(maxiter=200), algorithm='port', trace=TRUE,
na.action=na.omit,upper=upperList[[i]], lower=lowerList
[[i]])
}
but I got this error message: Error in fctList[[i]](parList[i]) : element 1
is empty;
the part of the args list of '+' being evaluated was:
(a, (b/Portata))
What can I do to fix it?
I'm also wondering which kind of function (maybe another loop?) I could use to
automize the regression not only for
the variable NT.N but for every variable (PTG.P, PO4.P,. ..)
My dataframe look like this (a sample):
Fiume giorno mese anno Portata PTG.P PO4.P NT.N NH4.N NO3.N
BOD5 SiO2 data
1Vedeggio 101 1995 0.981 218.40 118.000 9.196 6.5700 2.06
6.080 4.33 34709
2Vedeggio 72 1995 0.965 125.84 54.000 8.701 5.2600 2.31
16.480 4.43 34737
3Vedeggio 73 1995 1.536 37.44 12.000 7.271 5.5600 1.88
5.240 4.15 34765
...
190 Cassarate 299 2008 1.240 26.00 20.000 2.480 0.1200 1.79
1.700 4.03 39720
191 Cassarate 13 10 2008 0.860 23.00 16.000 2.720 0.0200 2.13
1.780 3.71 39734
192 Cassarate 10 11 2008 8.840 26.00 14.000 2.900 0.0500NA
1.400 3.62 39762
193 Cassarate 9 12 2008 2.030 35.00 23.000 2.190 0.0700 1.79
1.950 3.74 39791
...
279 Laveggio 151 2002 0.347 77.00 30.000 9.690 0.4300 7.23
1.950 4.17 37271
280 Laveggio 112 2002 0.527 54.00 17.000 7.520 0.8800 5.87
2.410 3.58 37298
281 Laveggio 133 2002 0.900 34.00 15.000 7.520 0.7100 6.17
6.550 3.03 37328
...
Thanks to anyone that could give me any hint!!
Laura
## a for loop
resultList - list()
for (i in 1:5)
{
## storing the result as the i'th list component
## notice that the i'th list components in fctList and startList
## are used for the i'th fit
resultList[[i]] - nls(NT.N ~ fctList[[i]](parList[[i]]), data=subset(dati,
Fiume==Laveggio), start=startList
[[i]], nls.control(maxiter=200), algorithm='port', trace=TRUE,
na.action=na.omit)
}
Messaggio originale
Da: r...@life.ku.dk
Data: 03.02.2009 19.00
A: lauramorg...@bluewin.ch
Oggetto: Re: [R] non linear regression with nls
Hi Laura,
I've the following suggestion for you using several lists and a for loop:
fz1-function(Portata, a, b){a+b/Portata}
fz2-function(Portata, a, b){a*exp(b*Portata)}
fz3-function(Portata, a, b, d, e){a+b/Portata+d*(Portata^e)}
fz4-function(Portata, b, d){b*Portata^d}
fz5-function(Portata, a, b, d){a+b*(Portata^d)}
fctList - list(fz1, fz2, fz3, fz4, fz5)
startList - list(list(a=10, b=10), list(a=10, b=1), start=list(a=10, b=10,
d=10, e=10),
list(a=10, b=1), list(a=10, b=10, d=1))
## a for loop
resultList - list()
for (i in 1:5)
{
## storing the result as the i'th list component
## notice that the i'th list components in fctList and startList
## are used for the i'th fit
resultList[[i]] - nls(NT.N