Hi,


I encountered with some difficulty in preparing the nonlin.function for the
gnm function. Please help me.


 I want to use the gnm function in the "gnm" package to fit the following
spherical function


y =  a + b (1.5*x - 0.5 *(x/c))         if  x< c

y =  a + b                                            if  x >= c


I understand that the fit.variogram function in the gstat function was
designed for fitting variogram, but it seems to be questionable because of
the normality assumption on the residuals. It is interested that whether
the fitted model would be changed as another distribution was assumed.


Seems to me, the gnm function in the gnm/R package could be used for the
this. However, I failed to customize a proper "nonlin" object for the
aforementioned formula after a few hours of try.

The following are my crappy code defining the nonlin object.

-------------------------------------------------------------

myfun<-function(x) {

  list( predictors = list(nuggest = .1, psill = 1, range=5),    variables =
list(substitute(x)),

    term <- function(predLabels, varLabels) {

      paste0("pred=", predLabels[1], "+", predLabels[2], "*(1.0 - exp(-",
varLabels[1], "/", predLabels[3], ")")

#       paste0("pred[which(", varLabels[1], ">", predLabels[3], ")]=",
predLabels[3], "+", predLabels[2])

#       paste0("pred")

    }

  )

}

class(myfun) <- "nonlin"

-------------------------------------------------------------

In addition, I have also tried the gnls function in the nlme package but
did not find any parameters in function would allow to specify a
distribution for the residuals.


I appreciate any help, suggestion, comment on my question.Thank you very
much.


Best regards,


Zhiqiu



The following code are largely irrelevant to my question, but it could be
used to generate a semivarogram table for the analysis.

#The Sph model in SP analysis

sph.fun<-function(dist, nugget, psill, range) {

  res<-nugget+psill*(1.5*dist/range-.5*(dist/range)^3)

  id.far=which(dist>=range)

  if (NROW(id.far)>0)  res[id.far]= sum(nugget, psill)

  res

}



#simulate semivariogram data

library(gstat)

dist=1:100

dat=data.frame(np=300.0, dist=(dist)+0.001,

               gamma=sph.fun(dist, nugget = 1, psill = 9, range =
20)+rnorm(NROW(dist))*1e-3,

               dir.hor=0.0, dir.ver=0.0,  id=as.factor(1))

v=dat;

class(v)<-"gstatVariogram"



#By defalut, WLS is used and the weight is  w=np/dist^2

ft1=fit.variogram(v, vgm(nugget = 1, mod="Sph", psill = 1, range = 5))



#use the nls to fit the data

ft2=nls(gamma ~ sph.fun(dist, nugget, psill, range),

        data = dat,

        start = list(nugget=1,  psill= 1, range = 5),

        weight=np/dist^2,

        algorithm="port",

        lower=c(0, 0, 0),

        trace=F)

	[[alternative HTML version deleted]]

