查找最大化结果的模型预测值

时间:2016-10-13 17:46:23

标签: r math mathematical-optimization lme4

如何找到模型预测变量的值集(线性和非线性的混合),它们产生最高的响应值。

示例模型:

library(lme4); library(splines)

summary(lmer(formula = Solar.R ~ 1 + bs(Ozone) + Wind + Temp + (1 | Month), data = airquality, REML = F))

在这里,我感兴趣的是什么条件(预测因子)产生最高的太阳辐射(结果)。

这个问题看起来很简单,但我未能使用Google找到一个好的答案。

如果模型很简单,我可以使用导数找到最大值或最小值。有人建议如果可以提取模型函数,则可以使用stats::optim()函数。作为最后的手段,我可​​以模拟输入值的所有合理变化,并将其插入predict()函数并查找最大值。

提到的最后一种方法似乎并不高效,我认为这是一项足够普通的任务(例如,找到最佳广告客户),有人已经建立了一些处理它的工具。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

这里有一些概念问题。

  • 对于简单术语(WindTemp),响应是预测变量的线性(因此也是单调和无界)函数。因此,如果这些术语具有正参数估计值,则将其值增加到无穷大(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)的最小值/最大值。

通过自动选择简单项的最小值/最大值并仅优化复数(多项式/样条/等)项,可以提高这种强力解决方案的效率。