我正在尝试编写一个函数,它将第1列中的因变量数据帧和第2列中的n个独立变量转换为n + 1,以适合y~x1 + .. xn + 1之间的线性模型,受制于x1到xn的所有系数均为0或以上的约束。
为此,我开始使用optim和一些函数来生成通用文本公式以最小化RSS,并将其评估为优化器中的代码。但是,我的方法返回以下错误:
Error in par[1] : object of type 'closure' is not subsettable
基本上,我使用optim来使用约束来执行OLS的想法基于以下示例:https://magesblog.com/post/2013-03-12-how-to-use-optim-in-r/
以下是功能(包括样本数据)
set.seed(1000)
#Function to produce n vectors + one y vector with 5000 observation (approx 20 business years):
sampler <- function(n){
df <- data.frame(y=sample(-100:100,5000, replace=TRUE))
for (i in (1:n+1)){
df[,i] <- sample(-100:100,5000,replace=TRUE)
}
df
}
#Function to produce formula for constrained optimization
formfun <- function(n) {
part <- ""
parts <- c("sum((")
for (i in (1:n)){
part[i]<- paste0("par[",i,"] * df[",i+1,"] + ",sep="")
parts <- append(parts,part[i])
}
parts <- paste0(append(parts,"-df[1])^2)"),sep="")
parts
}
#Function to evaluate formula
min.RSS <- function(par,data,form) {
eval(parse(text=paste0(form)))
}
插入n:
n=5
df <- sampler(n)
formula <- formfun(n)
min.RSS(par,data=df,form=formula)
最后,将所有参数的公式赋予优化器:
result <- optim(par = c(rep(1,n)),min.RSS(par, data=df, form=formula), method = c("L-BFGS-B"), lower = 0.00, upper = 10000)
不幸的是,这给了:
Error in par[1] : object of type 'closure' is not subsettable
非常感谢任何帮助,为什么会发生这种情况!