Как подогнать нелинейную плоскость к данным, используя 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

0 ответов

Другие вопросы по тегам