Скажем, я пытаюсь оптимизировать параметры функции при данных данных. Скажем, что параметр представляет собой трехэлементный вектор. Используя функцию constrOptim, я мог бы установить условия, что сумма параметров должна быть больше или равна 1, ... (используя аргументы ui и ci функции constrOptim).R: Ограниченная оптимизация: установите ограничение на количество ненулевых параметров
Но как бы я хотел ограничить вектор параметров из трех элементов, чтобы иметь только 2 ненулевых элемента? Я не могу найти способ - я думал о том, чтобы указать 4-элементный вектор параметров, где 4-й элемент является функцией первых трех элементов вектора (т. Е. Подсчитывает число ненулевых в первых трех элементах вектора а затем ограничить это до определенного числа), но не может заставить ничего работать. Любые идеи (очень ценятся)?
#Some simple code as context:
data=cbind(rnorm(5)+1,rnorm(5)+1,rnorm(5)+1)
par=c(0.5,0.3,0.2)
fn=function(par,data) {return(as.numeric(rep(1,times=5)%*%(data%*%par)))}
#setting the conditions that the sum of the parameters must be 1:
u1<-rbind(c(1,1,1),c(-1,-1,-1))
c1<-c(0.999, -1.001)
constr.optim1<-constrOptim(c(0.3,0.3,0.4), f=fn, data=data,grad=NULL, ui=u1, ci=c1)
sum(constr.optim1$par) #=0.99997 which is close enough to 1 as specified
#But how would I set/restrict:
length(which(constr.optim1$par!=0)) #to equal 2 and not 3?