0

I am trying to test R for non linear constrained optimization. I have 2 files: T1.csv has

 DV  LB  UB  Hist_Inv
X1  0.7 1.3     28462739.43
X2  0.7 1.3      177407.18
X3  0.7 1.3      1423271.12

and T2.csv has

Count  DV  weight_f    weight_v  p  coef
1   X1  2.310281831 3.661156016 0.5 1828.105881
2   X1  0.693084549 2.20503016  0.5 1460.686147
3   X1  0.207925365 2.030522789 0.5 1436.277144
4   X1  0   5.248353307 0.8 1050.493355
5   X1  0   1.591805116 0.8 983.9964128
6   X1  0   1.933056056 0.8 459.9371809
7   X2  7.322516444 138 0.5 387.4659072
8   X2  3.661258222 139 0.5 606.8684771
9   X2  1.830629111 176.5   0.5 358.8902965
10  X3  164294.4758 77024   0.2 282.0477107
11  X3  98576.68545 122261.4    0.2 345.9217482
12  X3  59146.01127 166242.84   0.2 364.9587162

And the code is...

df <- read.csv("C:/Users/prashant.mudgal/Downloads/T1.csv")
dv <- read.csv("C:/Users/prashant.mudgal/Downloads/T2.csv")
decVars <- dv$DV
coeff <- dv$coef
wf<-dv$weight_f
wv<-dv$weight_v
p<-dv$p
y<-0
inv<-df$Hist_Inv

fr <- function(decVars) {  
    for(i in 1:length(decVars)){
        k <-coeff[i]*(wf[i] + wv[i] * decVars[i])**p[i]
        y <- y + k
    }
    y
}

temp<-0
for(j in 1:length(inv)){
    temp[j]<- 1
}


optim(temp, fr, NULL,control=list(fnscale=-1))
##constrOptim(inv,fr,NULL,Control=list(fnscale=-1))

I have to use constraints in optimization. Cons are in my T1.csv file, specified as UB and LB such that

0.7<=X1<=1.3
0.7<=X2<=1.3
0.7<=X3<=1.3

How do I specify the cons in my code? (I don't want to hard code them, I want to read them from the file T1.csv.)

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453
  • Use constroptim : http://stackoverflow.com/questions/16345271/setting-constraints-in-constroptim Then read your csv, put it in data.frame and mention the constraints value contained in it. – Colonel Beauvel Sep 15 '14 at 17:28
  • you don't need constrOptim, you just need box constraints (i.e. see `optim`, try `method="L-BFGS-B"`, and look at the `lower` and `upper` arguments. `lower` and `upper` can be specified as vectors that are columns of `df`. – Ben Bolker Sep 15 '14 at 17:40

1 Answers1

0

You can consider using the following approach :

#############
#### Df1 ####
#############
vd1f1 <- c("DV",  "LB",  "UB",  "Hist_Inv")
vd1f2 <- c("X1",  "0.7", "1.3", "28462739.43")
vd1f3 <- c("X2",  "0.7", "1.3", "177407.18")
vd1f4 <- c("X3",  "0.7", "1.3", "1423271.12")

mat1 <- rbind(vd1f2, vd1f3, vd1f4)
df1 <- as.data.frame(mat1)
colnames(df1) <- vd1f1
df1[, 2] <- as.numeric(df1[, 2])
df1[, 3] <- as.numeric(df1[, 3])
df1[, 4] <- as.numeric(df1[, 4])

#############
#### Df2 ####
#############
vd2f1 <- c("Count",  "DV",  "weight_f", "weight_v", "p",  "coef")
vd2f2 <- c("1", "X1",  "2.310281831", "3.661156016", "0.5", "1828.105881")
vd2f3 <- c("2", "X1",  "0.693084549", "2.20503016",  "0.5", "1460.686147")
vd2f4 <- c("3", "X1",  "0.207925365", "2.030522789", "0.5", "1436.277144")
vd2f5 <- c("4", "X1",  "0",   "5.248353307", "0.8", "1050.493355")
vd2f6 <- c("5", "X1",  "0",   "1.591805116", "0.8", "983.9964128")
vd2f7 <- c("6", "X1",  "0",   "1.933056056", "0.8", "459.9371809")
vd2f8 <- c("7", "X2",  "7.322516444", "138", "0.5", "387.4659072")
vd2f9 <- c("8", "X2",  "3.661258222", "139", "0.5", "606.8684771")
vd2f10 <- c("9", "X2",  "1.830629111", "176.5", "0.5", "358.8902965")
vd2f11 <- c("10", "X3",  "164294.4758", "77024", "0.2", "282.0477107")
vd2f12 <- c("11", "X3",  "98576.68545", "122261.4", "0.2", "345.9217482")
vd2f13 <- c("12", "X3",  "59146.01127", "166242.84", "0.2", "364.9587162")

mat2 <- rbind(vd2f2, vd2f3, vd2f4, vd2f5, vd2f6, vd2f7, vd2f8, vd2f9, vd2f10, vd2f11, vd2f12, vd2f13)
df2 <- as.data.frame(mat2)
colnames(df2) <- vd2f1

df2[,1] <- as.numeric(df2[,1])
df2[,3] <- as.numeric(df2[,3])
df2[,4] <- as.numeric(df2[,4])
df2[,5] <- as.numeric(df2[,5])
df2[,6] <- as.numeric(df2[,6])

df <- df1
dv <- df2

######################
#### Optimization ####
######################

decVars <- dv$DV
coeff <- dv$coef
wf <- dv$weight_f
wv <- dv$weight_v
p <- dv$p
y <- 0
inv <- df$Hist_Inv

fr <- function(decVars)
{
  if((decVars[1] > 1.3) | (decVars[1] < 0.7))
  {
    return(-10 ^ 30)
    
  }else if((decVars[2] > 1.3) | (decVars[2] < 0.7))
  {
    return(-10 ^ 30)
    
  }else if((decVars[3] > 1.3) | (decVars[3] < 0.7))
  {
    return(-10 ^ 30)
    
  }else
  {
    for(i in 1 : length(decVars))
    {
      k <- coeff[i] * (wf[i] + wv[i] * decVars[i]) ** p[i]
      y <- y + k
    }
    
    return(y)
  }
}

temp <- 0

for(j in 1 : length(inv))
{
  temp[j] <- 1
}

optim(temp, fr, NULL,control = list(fnscale = -1))
Emmanuel Hamel
  • 1,769
  • 7
  • 19