寻找最大化结果的模型预测变量值
Finding model predictor values that maximize the outcome
如何找到产生最高响应值的模型预测变量值集(线性和非线性的混合)。
示例模型:
library(lme4); library(splines)
summary(lmer(formula = Solar.R ~ 1 + bs(Ozone) + Wind + Temp + (1 | Month), data = airquality, REML = F))
这里我感兴趣的是什么条件(预测变量)产生最高的太阳辐射(结果)。
这个问题看起来很简单,但是我用Google没找到好的答案。
如果模型很简单,我可以求导数来找到最大值或最小值。有人提出,如果模型函数可以提取出来,可能会用到stats::optim()
函数。作为最后的手段,我可以模拟输入值的所有合理变化并将其插入 predict()
函数并寻找最大值。
最后提到的方法似乎不是很有效,我认为这是一项足够常见的任务(例如,为广告寻找最佳客户),有人已经构建了一些工具来处理它。感谢任何帮助。
这里有一些概念上的问题。
对于简单项(Wind
和 Temp
),响应是预测变量的线性(因此既是单调的又是无界的)函数。因此,如果这些项具有正参数估计值,将它们的值增加到无穷大 (Inf
) 将为您提供无限响应 (Solar.R
);如果系数为负,则值应尽可能小(负无穷大)。那么,实际上,如果参数估计分别为负或正,您希望将这些预测变量设置为最小或最大合理值。
对于 bs
项,我不确定 B 样条曲线的属性在边界节点之外是什么,但我很确定曲线会变为正无穷大或负无穷大,所以你遇到了同样的问题。但是,对于 bs
的情况,也可能存在一个或多个 interior 最大值。对于这种情况,我可能会尝试提取基本项并评估数据范围内的样条...
或者,你提到 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) 和 min/max 风 (2.3-20.7) 和温度 (57-97) 范围内居中。
通过为简单项自动选择 min/max 值并仅针对复杂项 (polynomial/spline/etc.) 进行优化,可以使这种强力解决方案更加高效。
如何找到产生最高响应值的模型预测变量值集(线性和非线性的混合)。
示例模型:
library(lme4); library(splines)
summary(lmer(formula = Solar.R ~ 1 + bs(Ozone) + Wind + Temp + (1 | Month), data = airquality, REML = F))
这里我感兴趣的是什么条件(预测变量)产生最高的太阳辐射(结果)。
这个问题看起来很简单,但是我用Google没找到好的答案。
如果模型很简单,我可以求导数来找到最大值或最小值。有人提出,如果模型函数可以提取出来,可能会用到stats::optim()
函数。作为最后的手段,我可以模拟输入值的所有合理变化并将其插入 predict()
函数并寻找最大值。
最后提到的方法似乎不是很有效,我认为这是一项足够常见的任务(例如,为广告寻找最佳客户),有人已经构建了一些工具来处理它。感谢任何帮助。
这里有一些概念上的问题。
对于简单项(
Wind
和Temp
),响应是预测变量的线性(因此既是单调的又是无界的)函数。因此,如果这些项具有正参数估计值,将它们的值增加到无穷大 (Inf
) 将为您提供无限响应 (Solar.R
);如果系数为负,则值应尽可能小(负无穷大)。那么,实际上,如果参数估计分别为负或正,您希望将这些预测变量设置为最小或最大合理值。对于
bs
项,我不确定 B 样条曲线的属性在边界节点之外是什么,但我很确定曲线会变为正无穷大或负无穷大,所以你遇到了同样的问题。但是,对于bs
的情况,也可能存在一个或多个 interior 最大值。对于这种情况,我可能会尝试提取基本项并评估数据范围内的样条...
或者,你提到 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) 和 min/max 风 (2.3-20.7) 和温度 (57-97) 范围内居中。
通过为简单项自动选择 min/max 值并仅针对复杂项 (polynomial/spline/etc.) 进行优化,可以使这种强力解决方案更加高效。