Hi!
I am trying to fit 2-dimensional data (global data with 2-degree
resolution) using nls.lm function of minpack.lm package. I am successful to
fit the transient data in a single grid point but not able to fit 2-D data.
The error message is listed below. I am just wondering if anybody has used
this routine to fit 2-D/3-D data?
Error in `colnames<-`(`*tmp*`, value = c("a", "b",
"c")) :
length of 'dimnames' [2] not equal to array extent
It seems like the error is generated after the iteration. I googled the
error but did not find anything significant.
It. 0, RSS = nan, Par. = 0 0 0
It. 1, RSS = 37.5, Par. = 0 0 0
Here is the code I used:
require(graphics)
library(ncdf)
library(minpack.lm)
data <-
"E:/R/Optimize_FIN.Params/output.with.zwt_actual.base.jul1993.nc"
dataModel <- open.ncdf(data)
data.obs <-
"E:/R/Optimize_FIN.Params/Prigent_fraction_jul1993_conserved.nc"
dataObs <- open.ncdf(data.obs)
data.params <- "E:/R/Optimize_FIN.Params/
surfdata_1.9x2.5_simyr1850_c120622.nc"
dataParams <- open.ncdf(data.params)
# get latitudes and longitudes
lat <- get.var.ncdf(dataModel,"lat",verbose=F)
nlat <- dim(lat)
lon <- get.var.ncdf(dataModel,"lon")
nlon <- dim(lon)
dimlat <- dim.def.ncdf("lat","degrees_north",lat)
dimlon <- dim.def.ncdf("lon","degrees_east",lon)
print(dimlat)
# get time dimension for model data
t <- get.var.ncdf(dataModel,"time")
nt <- dim(t)
tunits <- att.get.ncdf(dataModel,"time","units")
#get the variables from the netcdf file
zwt0 <- get.var.ncdf(dataParams,"ZWT0")
f0 <- get.var.ncdf(dataParams,"F0")
p3 <- get.var.ncdf(dataParams,"P3")
zwt <- get.var.ncdf(dataModel,"ZWT_ACTUAL")
qr <- get.var.ncdf(dataModel,"QOVER_LAG")
obs <- get.var.ncdf(dataObs,"frac")
close.ncdf(dataModel)
close.ncdf(dataParams)
close.ncdf(dataObs)
#change NA to zero in data
qr[is.na(qr)] <- 0
zwt[is.na(zwt)]<- 0
for (i in 1:144)
{
for (j in 1:96)
{
f.fin <- function(params,data) {
fin.mod <- expression(params$a*exp(-(data$a/params$b)) +
params$c*data$b)
eval(fin.mod)
}
p.fin <- list(a=f0, b=zwt0, c=p3)
d.fin <- list(a=zwt, b=qr)
model <- f.fin(p.fin, d.fin)
residFun <- function(p, observed, data) {
r.residual <-expression(observed - f.fin(p,data))
eval(r.residual)
}
parStart <- list(a=f0,b=zwt0,c=p3)
#perform the optimization
nls.out <- nls.lm(par=parStart, fn = residFun, observed = obs,
data = d.fin, control = nls.lm.control(maxiter
100,nprint=1))
}
}
summary(nls.out)
Any help would be greatly appreciated. Thank you.
Best,
Rajendra Paudel
Cornell University
[[alternative HTML version deleted]]