Как подогнать нелинейную плоскость к данным, используя nlm или optim
проблема
Я наблюдал данные в data.frame с тремя числовыми переменными (x,y,z), и я хочу подогнать нелинейную плоскость z=f(x,y) к наблюдаемым данным, оптимизируя параметры.
Я не понимаю, как использовать NLM или Optim, чтобы найти оптимальные значения параметров. Когда я так поступаю, начальные значения параметров не меняются. Буду признателен за любую оказанную помощь.
#prepare data.frame
x<-c(20, 25, 28, 18, 23, 15, 28, 13, 33, 20, 35, 23, 18, 33, 23, 33, 23, 13,
23, 18, 28, 18, 38, 28, 20, 30, 30, 20, 25, 15, 25, 15, 30, 20, 35, 25,
40, 23, 28, 30, 20, 25, 18, 25, 15, 30, 23, 33, 25)
y<-c(12, 38, 25, 25, 16, 21, 19, 16, 28, 29, 32, 34, 11, 37, 37, 25, 25, 19,
19, 16, 28, 28, 34, 34, 15, 38, 21, 21, 12, 24, 24, 12, 32, 32, 29, 29,
38, 11, 37, 24, 24, 15, 19, 21, 15, 29, 28, 34, 32)
z<-c(1.8, 2.0, 2.0, 1.7, 2.0, 1.5, 2.0, 1.0, 2.1, 1.6, 2.0, 1.8, 1.5, 2.0, 2
2.0, 2.1, 1.7, 1.0, 1.8, 1.9, 2.0, 1.6, 2.1, 2.0, 1.9, 2.0, 2.0, 1.7, 1.8,
1.5, 1.7, 1.2, 2.1, 1.5, 2.0, 1.9, 2.1, 1.8, 2.1, 2.1, 1.7, 2.0, 1.7, 2.0,
1.2, 2.0, 1.7, 2.0, 1.9)
my.df<-data.frame(x, y, z)
#set parameter starting values
p1 <- 1; p2 <- 225; p3 <- 0; p4 <- 0; p5 <- 120; p6 <- 43
my.par<-c(p1, p2, p3, p4, p5, p6)
#define objective function
my.fn<-function(x,y,z){
x= my.df$x
y= my.df$y
z= my.df$y
z.pred<-p1+p2/((1+exp(p3*x-p4))*(1+exp(p5*y-p6))) #the plane to be fitted
sum.sq.diff<-sum((z.pred-z)^2)
return(sum.sq.diff)
}
#optimize parameters
optim.out <- optim(fn = my.fn, par = my.par)
nlm.out <- nlm(f = my.fn, p = my.par)
#check fitted parameters
optim.out$par
nlm.out$estimate