[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