Alex J. Zambrano
2015-Apr-25 11:22 UTC
[R-es] Paquetes en R de programación lineal con muchas restricciones
Hola a tod en s. Quisiera saber si conocen algún paquete además de boot que permita realizar programación lineal con muchas restricciones. A continuación escribo el codigo que estoy utilizando rm(list = ls()) #Función para generar las variables independientes gen<-function(n,a=0,b=1){ X<-matrix(0,ncol=3,nrow=n) #Muestras distribuidas entre -1 y 1 cuyo radio sea menor que 1 for(i in 1:n){ m<-0 while(m==0){ U<-runif(3,min=-1,max=1) R<-t(U)%*%U if(R<=1){ X[i,]<-U/sqrt(R) m<-1 } } } #Transformación de muestras según la matriz correlación V<-diag(rep(sqrt(1/3),3)) C=matrix(c(1,0.03,-0.06,0.03,1,-0.28,-0.06,-0.28,1),ncol=3)#Matriz de correlación S<-V%*%C%*%V B<-chol(solve(S)) Z<-X%*%t(solve(B)) #Transformación de muestras para rango 0 y 1 Y<-(Z-min(Z))/(max(Z)-min(Z)) #Transformación de muestras entre a y b Y<-(b-a)*Y+a return(Y) } set.seed(25042015) #Prueba X<-gen(10000,a=-10,b=10) summary(X) cor(X) #Caso laplace library(VGAM)#Se debe cargar está librería independiente del boot (genera problemas) X<-gen(20,-10,10) e<-rlaplace(20,location=0,scale=1) Yest<-16+4*X[,1]+X[,2]+0.25*X[,3] # Valores a estimar 4, 1, 0.25 Y<-Yest+e n<-length(Y) p<-dim(X)[2] r<-n*(n-1)/2 H<-cbind(rep(1,n-1),-diag(1,n-1)) for(i in 1:(n-2)){ h<-cbind(matrix(0,n-1-i,i),rep(1,n-1-i),-diag(1,n-1-i)) H<-rbind(H,h) } library(boot) # Librería de programación #MINSADBED a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r)) A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) A32<-cbind(matrix(0,r,p),H,-diag(r),diag(r)) A3<-rbind(A31,A32) b3<-c(Y,matrix(0,r,1)) simplex(a,A3=A3,b3=b3) #MINSADBAD a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r)) A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) A32<-cbind(-X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) A33<-cbind(matrix(0,r,p),H,diag(r),-diag(r)) A3<-rbind(A31,A32,A33) b3<-c(Y,-Y,matrix(0,r,1)) simplex(a,A3=A3,b3=b3) La idea es estimar unos parámetros de un modelo de regresión, utilizando métodos de programación. La matriz X tiene cierta estructura de correlación, y los errores en el modelo son no normales. Al realizar la solución por MINSADBED con la función simplex del paquete boot, me arroja las estimaciones de Beta_1, Beta_2 y Beta_3 se encuentran en la solución optima de los primeros tres valores. Pero noten que se tiene una matriz de restricciones demasiado grande. Al realizar la solución por MINSADBAD las estimaciones de Beta_1, Beta_2 y Beta_3 no se logran obtener debido a que es una solución no factible. Al realizar está misma en paquete de programación winqsb la solución si logra obtener, pero construir esa matriz de restricciones es demasiado engorroso y más aún si de desea realizar un proceso de simulación. Agradezco me puedan ayudar. Saludos. -- Alex Johann Zambrano Carbonell http://experienceinstatistics.blogspot.com/ [[alternative HTML version deleted]]
Sergio Castro
2015-Apr-27 06:37 UTC
[R-es] Paquetes en R de programación lineal con muchas restricciones
Buenos días Alex, Yo tambien estoy generando problemas de programación lineal y utilizo los paquetes lpSolve y lpSolveAPI. Utilizo un número considerable de datos y no estoy teniendo problemas. Te paso los enlaces a estos dos paquetes: http://cran.r-project.org/web/packages/lpSolve/lpSolve.pdf http://cran.r-project.org/web/packages/lpSolveAPI/lpSolveAPI.pdf Espero que te sirva. Un saludo. El día 25 de abril de 2015, 13:22, Alex J. Zambrano <alexjzc en gmail.com> escribió:> Hola a tod en s. > > Quisiera saber si conocen algún paquete además de boot que permita realizar > programación lineal con muchas restricciones. A continuación escribo el > codigo que estoy utilizando > > rm(list = ls()) > > #Función para generar las variables independientes > gen<-function(n,a=0,b=1){ > X<-matrix(0,ncol=3,nrow=n) > #Muestras distribuidas entre -1 y 1 cuyo radio sea menor que 1 > for(i in 1:n){ > m<-0 > while(m==0){ > U<-runif(3,min=-1,max=1) > R<-t(U)%*%U > if(R<=1){ > X[i,]<-U/sqrt(R) > m<-1 > } > } > } > #Transformación de muestras según la matriz correlación > V<-diag(rep(sqrt(1/3),3)) > C=matrix(c(1,0.03,-0.06,0.03,1,-0.28,-0.06,-0.28,1),ncol=3)#Matriz de > correlación > S<-V%*%C%*%V > B<-chol(solve(S)) > Z<-X%*%t(solve(B)) > #Transformación de muestras para rango 0 y 1 > Y<-(Z-min(Z))/(max(Z)-min(Z)) > #Transformación de muestras entre a y b > Y<-(b-a)*Y+a > return(Y) > } > > set.seed(25042015) > > #Prueba > X<-gen(10000,a=-10,b=10) > summary(X) > cor(X) > > #Caso laplace > library(VGAM)#Se debe cargar está librería independiente del boot (genera > problemas) > X<-gen(20,-10,10) > e<-rlaplace(20,location=0,scale=1) > Yest<-16+4*X[,1]+X[,2]+0.25*X[,3] # Valores a estimar 4, 1, 0.25 > Y<-Yest+e > > n<-length(Y) > p<-dim(X)[2] > r<-n*(n-1)/2 > H<-cbind(rep(1,n-1),-diag(1,n-1)) > for(i in 1:(n-2)){ > h<-cbind(matrix(0,n-1-i,i),rep(1,n-1-i),-diag(1,n-1-i)) > H<-rbind(H,h) > } > > library(boot) # Librería de programación > > #MINSADBED > a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r)) > A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) > A32<-cbind(matrix(0,r,p),H,-diag(r),diag(r)) > A3<-rbind(A31,A32) > b3<-c(Y,matrix(0,r,1)) > > > simplex(a,A3=A3,b3=b3) > > > #MINSADBAD > a<-c(rep(0,p),rep(0,n),rep(1,r),rep(1,r)) > A31<-cbind(X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) > A32<-cbind(-X,diag(1,n),matrix(0,n,r),matrix(0,n,r)) > A33<-cbind(matrix(0,r,p),H,diag(r),-diag(r)) > A3<-rbind(A31,A32,A33) > b3<-c(Y,-Y,matrix(0,r,1)) > > simplex(a,A3=A3,b3=b3) > > > La idea es estimar unos parámetros de un modelo de regresión, utilizando > métodos de programación. La matriz X tiene cierta estructura de > correlación, y los errores en el modelo son no normales. > > Al realizar la solución por MINSADBED con la función simplex del paquete > boot, me arroja las estimaciones de Beta_1, Beta_2 y Beta_3 se encuentran > en la solución optima de los primeros tres valores. Pero noten que se tiene > una matriz de restricciones demasiado grande. > > Al realizar la solución por MINSADBAD las estimaciones de Beta_1, Beta_2 y > Beta_3 no se logran obtener debido a que es una solución no factible. > > Al realizar está misma en paquete de programación winqsb la solución si > logra obtener, pero construir esa matriz de restricciones es demasiado > engorroso y más aún si de desea realizar un proceso de simulación. > > Agradezco me puedan ayudar. > > Saludos. > > -- > Alex Johann Zambrano Carbonell > http://experienceinstatistics.blogspot.com/ > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es