Hi, I try to fit a non linear regression by minimising the sum of the sum of squares. The model is number[2]-(x/number[1])^number[3] Number [2] and number [1] change as the data changes but for all the set of data number[3] must be identical. I have 3 set of data (x1,y1), (x2,y2), (x3,y3). x_a<-c(0,0.5,1,1.5,2,3,4,6) y_a<-c(5.4,5,4.84,4.3,4,2,1.56,1.3) x_b<-c(0,1,2,3,4,5,6,7,8,9,10,11,12) y_b<-c(5.34,4.98,4.66,4.06,3,3.4,2.7,2.9,2.6,2.6,1.9,1.3,1.4) x_c<-c(0,3,6,8,10,12,14,16,18,20,24,26,28,30) y_c<-c(5.5,5.1,4.3,4,3.7,3.2,3.04,2.778,2.56,2.25,1.78,1.44,1.32,1.2) x<-c(x_a,x_b,x_c) y<-c(y_a,y_b,y_c) long<-c(0,8,21,35) Hence, the sum of squares is: Sce= sum( sum((y- number[4]-(x/number[1])^number[7])^2)+ sum((y- number[5]-(x/number[2])^number[7])^2)+ sum((y- number[6]-(x/number[3])^number[7])^2)+ for minimising this sum, I compute the function "sce": sce<-function(param){ sce_yest<-matrix(nrow=3,ncol=1) for( i in 1:3){ yy<-(y[((long[i]+1):long[i+1])]) xx<-x[(long[i]+1):(long[i+1])] y_est<-(param[i+2]-(xx/param[i])^param[(2*3)+1]) sce_yest[i,]<-sum((yy-y_est)^2) } return(sum(sce_yest)) } Then, I use the fonction optim for obtaining a vector of 7 parameters which will minimise the fonction sce. I use initial parameters at random that I don't have a answer relating to a minimum local. pinit=c(runif(3,min=0,max=10), runif(3,min=3,max=8),runif(1,min=0,max=4)) optim(p=pinit,sce) if I use the function as above, I got an answer but the value of the parameters is not in the interval I want. So I applied optim(p=pinit,sce, method="L-BFGS-B", lower=c(0,0,0,0,0,0,0), upper=c(10, 10,10,10,10,10,4),control=list(maxit=20000000,temp=20000)) but the program does not run. And I get this message "Error in optim(p = pinit, sce, method = "L-BFGS-B", lower = pinf, upper psup, : L-BFGS-B needs finite values of fn" And I don't understand why it doesn't work. Do I forget an option in optim computation. Or is there an other function instead of optim that I can use. Thanks in advance Anne Kervahu annekervahu at yahoo.fr
Kervahu Anne wrote:> Hi, > > I try to fit a non linear regression by minimising the sum of the sum of > squares. > > The model is number[2]-(x/number[1])^number[3] > Number [2] and number [1] change as the data changes but for all the set of > data number[3] must be identical. > > I have 3 set of data (x1,y1), (x2,y2), (x3,y3). > > x_a<-c(0,0.5,1,1.5,2,3,4,6) > y_a<-c(5.4,5,4.84,4.3,4,2,1.56,1.3) > > x_b<-c(0,1,2,3,4,5,6,7,8,9,10,11,12) > y_b<-c(5.34,4.98,4.66,4.06,3,3.4,2.7,2.9,2.6,2.6,1.9,1.3,1.4) > > x_c<-c(0,3,6,8,10,12,14,16,18,20,24,26,28,30) > y_c<-c(5.5,5.1,4.3,4,3.7,3.2,3.04,2.778,2.56,2.25,1.78,1.44,1.32,1.2) > > x<-c(x_a,x_b,x_c) > y<-c(y_a,y_b,y_c) > long<-c(0,8,21,35) > > Hence, the sum of squares is: > > Sce= sum( sum((y- number[4]-(x/number[1])^number[7])^2)+ > sum((y- number[5]-(x/number[2])^number[7])^2)+ > sum((y- number[6]-(x/number[3])^number[7])^2)+ > > for minimising this sum, I compute the function "sce": > > sce<-function(param){ > sce_yest<-matrix(nrow=3,ncol=1) > for( i in 1:3){ > yy<-(y[((long[i]+1):long[i+1])]) > xx<-x[(long[i]+1):(long[i+1])] > y_est<-(param[i+2]-(xx/param[i])^param[(2*3)+1]) > sce_yest[i,]<-sum((yy-y_est)^2) > } > return(sum(sce_yest)) > } > > Then, I use the fonction optim for obtaining a vector of 7 parameters which > will minimise the fonction sce. I use initial parameters at random that I > don't have a answer relating to a minimum local. > > pinit=c(runif(3,min=0,max=10), runif(3,min=3,max=8),runif(1,min=0,max=4)) > optim(p=pinit,sce) > > if I use the function as above, I got an answer but the value of the > parameters is not in the interval I want. So I applied > > optim(p=pinit,sce, method="L-BFGS-B", lower=c(0,0,0,0,0,0,0), upper=c(10, > 10,10,10,10,10,4),control=list(maxit=20000000,temp=20000)) > > but the program does not run. And I get this message > > "Error in optim(p = pinit, sce, method = "L-BFGS-B", lower = pinf, upper > psup, : > L-BFGS-B needs finite values of fn"As it says, you get infinite values, probably from (x/number[1]) ... Uwe Ligges> > And I don't understand why it doesn't work. Do I forget an option in optim > computation. Or is there an other function instead of optim that I can use. > > Thanks in advance > > Anne Kervahu > annekervahu at yahoo.fr > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! R-project.org/posting-guide.html