【发布时间】:2012-03-28 08:34:59
【问题描述】:
我正在处理模型的输出,其中存在可能不遵循先验预期的参数估计值。我想编写一个函数来强制这些效用估计值符合这些预期。为此,该函数应最小化起始值和新估计值之间的平方偏差之和。由于我们有先验期望,因此优化应该受到以下约束:
B0 < B1
B1 < B2
...
Bj < Bj+1
例如,下面的原始参数估计值是针对 B2 和 B3 翻转的。 Delta 和 Delta^2 列显示了原始参数估计值与新系数之间的偏差。我正在尝试最小化列Delta^2。我已经在 Excel 中对此进行了编码,并展示了 Excel 的 Solver 如何通过提供一组约束来优化此问题:
Beta BetaRaw Delta Delta^2 BetaNew
B0 1.2 0 0 1.2
B1 1.3 0 0 1.3
B2 1.6 -0.2 0.04 1.4
B3 1.4 0 0 1.4
B4 2.2 0 0 2.2
阅读?optim 和?constrOptim 后,我无法理解如何在 R 中进行设置。我确定我只是有点密集,但可以在右侧使用一些指针方向!
3/24/2012 - 添加赏金,因为我不够聪明,无法翻译第一个答案。
这里有一些 R 代码应该在正确的路径上。假设 beta 开始于:
betas <- c(1.2,1.3,1.6,1.4,2.2)
我想最小化以下函数,使得b0 <= b1 <= b2 <= b3 <= b4
f <- function(x) {
x1 <- x[1]
x2 <- x[2]
x3 <- x[3]
x4 <- x[4]
x5 <- x[5]
loss <- (x1 - betas[1]) ^ 2 +
(x2 - betas[2]) ^ 2 +
(x3 - betas[3]) ^ 2 +
(x4 - betas[4]) ^ 2 +
(x5 - betas[5]) ^ 2
return(loss)
}
为了证明该函数有效,如果我们将原始 beta 传递进来,损失应该为零:
> f(betas)
[1] 0
而且相对较大,有一些随机输入:
> set.seed(42)
> f(rnorm(5))
[1] 8.849329
并以我能够在 Excel 中计算的值最小化:
> f(c(1.2,1.3,1.4,1.4,2.2))
[1] 0.04
【问题讨论】:
-
经过反思,您实际上是在描述有序逻辑回归 (en.wikipedia.org/wiki/Ordered_logit)。在包
MASS中的函数polr可以解决这类问题。 stat.washington.edu/quinn/classes/536/S/polrexample.html 有一个例子。 Kenneth Train 在他的“离散选择方法与模拟”一书中很好地描述了这一点 -
@Andrie - 也许我只需要早上的咖啡,但我很难将 polr 示例和我需要在这里做的事情联系起来。使用
polr(),目标不是预测一组比例优势比吗?我的书架上放着 Ken Train 的书(收集灰尘),所以我也要试一试。谢谢。 -
@Andrie +1 for Train。请注意,它也以 PDF 形式在线提供。
标签: r