[R] ddply and nlminb
Robert Clement
robert.clement at ed.ac.uk
Wed Apr 13 14:16:16 CEST 2011
Hello
I'm new to R (one week) so please excuse any obvious mistakes in my code
or posting.
I am attempting to fit a non linear function defining the relationship
between dependent variable A and the variables PAR and T grouped by the
condition Di.
The following steps are taken in the Rcode below:
1) load the data (not shown)
2) define the function to be fit
3) define the starting values of the fit parameters and their upper and
lower limits
4) fit the function using all data using nlminb (Di groupings not
considered)
5) estimate the parameter standard errors
6) fit the function with the data grouped by Di using ddply
The first 5 steps appear to be working alright and produce reasonable
fit parameters and parameter errors.
However, when attempting to fit the function with the data grouped by Di
the parameters are returned with the same value for each grouping:
> R3Dpar
Di V1 V2
V3 V4 V5 V6
1 0.033461 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
2 0.082682 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
3 0.133670 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
4 0.195940 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
5 0.272430 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
6 0.368960 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
7 0.500150 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
8 0.748380 0.06081973 -2.119109e-05 31.75188 -2.631321 17.32565 0.821518
Can someone point out the error in my ways, and also the correct way to
return both the parameter estimates and the parameter errors.
Thank you
Robert
# ------------ END OF CODE
------------------------------------------------------------------------------------------
# ------------ Data loaded in data frame M2 and attached - not shown.
# ------------ Define function
fnonRecHypT <- function(x){
qeo = x[1]
dqe = x[2]
Fmo = x[3]
TL = x[4]
To = x[5]
TH = 45
theta = x[6]
qe = qeo + dqe*T
theta =
phi = (TH-To)/(To-TL)
Fm = Fmo*((T-TL)*(TH-T)^ phi) / ((To-TL)*(TH-To)^ phi)
Aest = (qe*PAR + Fm - ((qe*PAR + Fm)^2 - 4*theta*qe*PAR*Fm)^0.5)/(2.*theta)
result = sum((Aest-A)^2 )
}
# ------------ Define parameter starting values and limits
startval = c(0.05,-0.01,20, -5,15,0.5)
lowval = c(0.01,-0.05, 5,-15, 7,0.1)
uppval = c(0.2, 0.02,50, 0,25,0.99)
# ------------ Fit using entire data set
R3 <- nlminb(startval, fnonRecHypT, control=list(trace=1),
lower=lowval, upper = uppval)
# ------------ estimate fit parameter standard errors
x = R3$par
D3 = hessian(fnonRecHypT,x)
e3 = sqrt(diag(solve(D3)))
# ------------ attempt to fit by grouping variable, Di (Di is a real
vector with 8 possible values)
R3Dpar= ddply(M2,
.(Di),
function(x) {res <- nlminb(startval, fnonRecHypT,
control=list(trace=1), lower=lowval, upper = uppval)
return(res$par)
}
)
# ------------------------- END OF CODE
-----------------------------------------------------------------------------
--
School of Geosciences
University of Edinburgh
202 Crew Building
West Mains Road
Edinburgh
Scotland
EH9 3JN
Ph +44 (0)131 650 7732
Fx +44 (0)131 662 0478
email robert.clement at ed.ac.uk
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
More information about the R-help
mailing list