如何找到模型预测变量的值集(线性和非线性的混合),它们产生最高的响应值。
示例模型:
library(lme4); library(splines)
summary(lmer(formula = Solar.R ~ 1 + bs(Ozone) + Wind + Temp + (1 | Month), data = airquality, REML = F))
在这里,我感兴趣的是什么条件(预测因子)产生最高的太阳辐射(结果)。
这个问题看起来很简单,但我未能使用Google找到一个好的答案。
如果模型很简单,我可以使用导数找到最大值或最小值。有人建议如果可以提取模型函数,则可以使用stats::optim()
函数。作为最后的手段,我可以模拟输入值的所有合理变化,并将其插入predict()
函数并查找最大值。
提到的最后一种方法似乎并不高效,我认为这是一项足够普通的任务(例如,找到最佳广告客户),有人已经建立了一些处理它的工具。任何帮助表示赞赏。
答案 0 :(得分:2)
这里有一些概念问题。
对于简单术语(Wind
和Temp
),响应是预测变量的线性(因此也是单调和无界)函数。因此,如果这些术语具有正参数估计值,则将其值增加到无穷大(Inf
)将为您提供无限响应(Solar.R
);如果系数为负,则值应尽可能小(负无穷大)。实际上,如果参数估计分别为负或正,您希望将这些预测变量设置为最小或最大合理值。
对于bs
项,我不确定B样条的属性是否超出了边界结,但我很确定曲线会变为正或负无穷大,所以你有同样的问题。但是,对于bs
的情况,也可能存在一个或多个内部最大值。对于这种情况,我可能会尝试提取基本术语并评估数据范围内的样条...
或者,你提到optim
让我觉得这是可能的:
data(airquality)
library(lme4)
library(splines)
m1 <- lmer(formula = Solar.R ~ 1 + bs(Ozone) + Wind + Temp + (1 | Month),
data = airquality, REML = FALSE)
predval <- function(x) {
newdata <- data.frame(Ozone=x[1],Wind=x[2],Temp=x[3])
## return population-averaged prediction (no Month effect)
return(predict(m1, newdata=newdata, re.form=~0))
}
aq <- na.omit(airquality)
sval <- with(aq,c(mean(Ozone),mean(Wind),mean(Temp)))
predval(sval)
opt1 <- optim(fn=predval,
par=sval,
lower=with(aq,c(min(Ozone),min(Wind),min(Temp))),
upper=with(aq,c(max(Ozone),max(Wind),max(Temp))),
method="L-BFGS-B", ## for constrained opt.
control=list(fnscale=-1)) ## for maximization
## opt1
## $par
## [1] 70.33851 20.70000 97.00000
##
## $value
## [1] 282.9784
正如预期的那样,这是臭氧(1-168)范围的中间值,风(2.3-20.7)和温度(57-97)的最小值/最大值。
通过自动选择简单项的最小值/最大值并仅优化复数(多项式/样条/等)项,可以提高这种强力解决方案的效率。