[R] nls
Martin Maechler
maechler at stat.math.ethz.ch
Sat Sep 23 12:39:03 CEST 2006
>>>>> "SpG" == Spencer Graves <spencer.graves at pdf.com>
>>>>> on Sat, 23 Sep 2006 00:52:30 -0700 writes:
SpG> I used "debug" to walk through your example line by line, I found
SpG> that the error message was misleading. By making
SpG> as.vector(semivariance) and as.vector(h) columns of a data.frame, I got
SpG> it to work. My revised code appears below.
SpG> Thanks for providing a self-contained and relatively simple
SpG> example. Without it, I could have done little more that suggest
SpG> 'traceback' (which provided zero information when I tried it) and 'debug'.
Thank you, Spencer, for picking this up.
Your solution is probably fine for Mzabalazo Ngwenya.
However your note about the unhelpful error message made me dig
a bit further.
My current diagnosis: nls() is at first doing a *multivariate* model
in this case which model.frame() happily does.
Later in nlsModel(); qr() does not deal with such multivariateness
and hence produces a 'QR' result which does not "fit" the other
parts of the computations.
I think we should decide if it is easy enough to make nls() work
with multivariate models and do it if it's "easy" and otherwise
disallow it consciously -- both via a better
error message and the help page.
Well, for R 2.4.0 it should be possible to do the latter and I
think we should...
This is now becoming an "R-devel" rather than "R-help" topic..
Martin
SpG> Hope this helps.
SpG> Spencer Graves
SpG> fit.gaus<-function(coordinates,values,guess.c0,guess.c1,guess.a)
SpG> {
SpG> long<-rep(coordinates[,1],each=length(coordinates[,1]))
SpG> lag.long<-t(matrix(long,nrow=length(coordinates[,1]),byrow=TRUE))
SpG> dif.long <-(lag.long-t(lag.long))^2
SpG> lat <-rep(coordinates[,2],each=length(coordinates[,2]))
SpG> lag.lat<-t(matrix(lat,nrow=length(coordinates[,2]),byrow=TRUE))
SpG> dif.lat <-(lag.lat-t(lag.lat))^2
SpG> h <-sqrt(dif.long+dif.lat)
SpG> if( length(values[1,])>1)
SpG> {
SpG> y.m <-apply(values,1,sum,na.rm=TRUE)
SpG> y.m <-as.matrix(y.m)
SpG> y.mod <-(1/length(values[1,]))*(y.m)
SpG> }
SpG> else
SpG> {
SpG> y.mod <-as.matrix(values)
SpG> }
SpG> semi <-rep(y.mod,each=length(y.mod))
SpG> mat1<-t(matrix(semi,nrow=length(y.mod),byrow=TRUE))
SpG> mat2<-t(mat1)
SpG> semivariance <-(1/2)*(mat1-mat2)^2
SpG> # model <-semivariance ~c0+c1*(1-exp(-(h^2)/a^2))
SpG> DF <- data.frame(smvar=as.vector(semivariance),
SpG> h.=as.vector(h) )
SpG> mdl <- smvar~c0+c1*(1-exp(-(h.^2)/a^2))
SpG> # parameters <-nls(model,start =
SpG> #list(c0=guess.c0,c1=guess.c1,a=guess.a),trace=TRUE)
SpG> parameters <-nls(mdl,start =
SpG> list(c0=guess.c0,c1=guess.c1,a=guess.a),trace=TRUE,
SpG> data=DF )
SpG> results <-summary(parameters)
SpG> print(results)
SpG> }
SpG> ################################
SpG> mzabalazo ngwenya wrote:
>> Hello everyone !
>>
>> I am trying to write a short program to estimate semivariogram
>> parameters. But I keep running into a problem when using the nls
>> function.
>>
>> Could you please shed some light. I have put a sample of one of the
>> codes and ran a short example so you see what I mean.
>>
>> -----------------
>>
>>
>>
>> fit.gaus<-function(coordinates,values,guess.c0,guess.c1,guess.a)
>> {
>> long<-rep(coordinates[,1],each=length(coordinates[,1]))
>>
>> lag.long<-t(matrix(long,nrow=length(coordinates[,1]),byrow=TRUE))
>> dif.long <-(lag.long-t(lag.long))^2
>> lat <-rep(coordinates[,2],each=length(coordinates[,2]))
>> lag.lat<-t(matrix(lat,nrow=length(coordinates[,2]),byrow=TRUE))
>> dif.lat <-(lag.lat-t(lag.lat))^2
>> h <-sqrt(dif.long+dif.lat)
>>
>>
>> if( length(values[1,])>1)
>> {
>> y.m <-apply(values,1,sum,na.rm=TRUE)
>> y.m <-as.matrix(y.m)
>> y.mod <-(1/length(values[1,]))*(y.m)
>> }
>> else
>> {
>> y.mod <-as.matrix(values)
>> }
>>
>> semi <-rep(y.mod,each=length(y.mod))
>> mat1<-t(matrix(semi,nrow=length(y.mod),byrow=TRUE))
>> mat2<-t(mat1)
>> semivariance <-(1/2)*(mat1-mat2)^2
>>
>> model <-semivariance ~c0+c1*(1-exp(-(h^2)/a^2))
>> parameters <-nls(model,start =
>> list(c0=guess.c0,c1=guess.c1,a=guess.a),trace=TRUE)
>> results <-summary(parameters)
>> print(results)
>> }
>> --------------------------
>>
>>
>>> don <-matrix(c(2,3,9,6,5,2,7,9,5,3),5,2)
>>> don
>>>
>> [,1] [,2]
>> [1,] 2 2
>> [2,] 3 7
>> [3,] 9 9
>> [4,] 6 5
>> [5,] 5 3
>>
>>> data <-matrix(c(3,4,2,4,6))
>>> data
>>>
>> [,1]
>> [1,] 3
>> [2,] 4
>> [3,] 2
>> [4,] 4
>> [5,] 6
>>
>>> fit.gaus(don,data,2,3,5)
>>>
>> [,1] [,2] [,3] [,4] [,5]
>> [1,] 0.000000 5.099020 9.899495 5.000000 3.162278
>> [2,] 5.099020 0.000000 6.324555 3.605551 4.472136
>> [3,] 9.899495 6.324555 0.000000 5.000000 7.211103
>> [4,] 5.000000 3.605551 5.000000 0.000000 2.236068
>> [5,] 3.162278 4.472136 7.211103 2.236068 0.000000
>> 178.9113 : 2 3 5
>> Error in qr.qty(QR, resid) : 'qr' and 'y' must have the same number of
>> rows
>>
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
SpG> ______________________________________________
SpG> R-help at stat.math.ethz.ch mailing list
SpG> https://stat.ethz.ch/mailman/listinfo/r-help
SpG> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
SpG> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list