提问人:Jens Munk 提问时间:11/13/2023 最后编辑:Jens Munk 更新时间:11/14/2023 访问量:46
R:求从 lm() 动态生成的公式的极值
R: Finding extrema of formula generated dynamically from lm()
问:
我想从模型的系数和变量中生成函数,并用于查找极值。使用并不能提供我需要的分辨率。这些模型有几个维度。lm()
nlminb()
predict()
lm()
x
是我的数据表。 是由一种称为 的算法生成的模型。Y3m5
lm()
stepForward
手动编写函数:
fY3m5 <- function(Y3model5) {
-(Y3m5$coefficients[1] +
Y3model5[1]*Y3m5$coefficients[2] +
Y3model5[2]*Y3m5$coefficients[3] +
Y3model5[3]*Y3m5$coefficients[4] +
Y3model5[4]*Y3model5[4]*Y3m5$coefficients[5] +
Y3model5[4]*Y3m5$coefficients[6] +
Y3model5[5]*Y3m5$coefficients[7] +
Y3model5[2]*Y3model5[3]*Y3m5$coefficients[8] +
Y3model5[2]*Y3model5[4]*Y3m5$coefficients[9] +
Y3model5[2]*Y3model5[5]*Y3m5$coefficients[10])
}
并运行它:nlminb()
nlminb(c(0.0055,
0.0018,
0.15,
0.036,
0.0425),
fY3m5,
hessian=NULL,
upper = unlist(lapply(x[1:6], max)),
lower = unlist(lapply(x[1:6], min)))
工作是一种享受,并给出有意义的最低限度。
相反,尝试从模型动态生成函数,lm()
首先定义为空间的中心(均值)starts
starts <- c("x" = 1, unlist(lapply(x[1:6],mean)))
并作为字符串替换向量repl1
repl1 <- c("starts['x']", "", "", "*", "", paste0("starts['", names(x[1:6]), "']"))
names(repl1) <- c("Intercept", "\\)", "\\(", ":", "I", names(x[1:6]))
然后从模型中制作函数lm()
fY3m5_2 <- function(model, starts) {
function(starts) {
noquote(
paste0("-(",
paste(
paste0(
str_replace_all(
labels(model$coefficients),
repl1),
"*",
"(",
model$coefficients,
")"),
collapse = " + "),
")")
)
}
}
恕我直言,应该工作。但是做
nlminb(c(0.0055,
0.0018,
0.15,
0.036,
0.0425),
eval(fY3m5_2(Y3m5,)),
hessian=NULL,
upper = unlist(lapply(x[1:6], max)),
lower = unlist(lapply(x[1:6], min)))
不会给出预期的结果(就像手动编写函数一样)。
令我惊讶的是,要找到任何好的线索是多么困难,而上述内容我花了很长时间才达到。据我所知,以前没有尝试过生成可食用的函数 nlminb()。如果我错了,请道歉。请帮我克服最后的障碍!
谢谢!
答: 暂无答案
评论