首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的三维预测极限

R中的三维预测极限
EN

Stack Overflow用户
提问于 2017-05-19 12:14:33
回答 1查看 214关注 0票数 0

让一个有3个变量的数据集(这里是正常的和独立的,但它们可以相互关联)

代码语言:javascript
复制
data = data.frame(x1 = rnorm(10000),
x2 = rnorm(10000),
x3 = rnorm(10000))

我想得到x1,x2和x3的最窄范围,使95%的观测结果都在这三个范围之内。

到目前为止,我有下面的代码。

代码语言:javascript
复制
is.between <- function(x, a, b){
    x <= max(c(a, b)) & x >= min(c(a, b))
  }   
getlims <- function(lims, x1, x2, x3){
      abs(mean(
        is.between(x1, lims[1], lims[2]) & 
          is.between(x2, lims[3], lims[4]) & 
          is.between(x3, lims[5], lims[6]) 
      ) - 0.95) 
    }

optim(initial_values, getlims, x1=x1,x2=x2,x3=x3)

其中lims5,6 1,2是x1的范围,lims5,6 3,4是x2的范围,lims5,6 5,6是x3的范围。

它提供了包含我观察到的95%的限制,但并不保证它会是较小的体积限制值1,2* limits 3,4*limits 5,6。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-21 08:38:57

我认为这实际上是一个离散优化的问题。它是在三维空间中给出的,我把它在两个维度中重新表述,以便有一个更好的可视化,它可以立即扩展到更多的维度。

让我们试着把它作为一个带约束的非线性优化问题来解决。

代码语言:javascript
复制
set.seed(1009)
N <- 1000
x <- rnorm(N); y <- rnorm(N)

还需要这些坐标的0.05和0.95分位数。

代码语言:javascript
复制
q1 <- quantile(x, 0.05); q2 <- quantile(x, 0.95)
q3 <- quantile(y, 0.05); q4 <- quantile(y, 0.95)

我们定义了两个函数,fmin是要最小化的函数,fbnd是定义约束的函数。也就是说,我们需要fbnd(x) >= 0,用这种方式表示至少95%的点位于矩形内。

代码语言:javascript
复制
fmin <- function(p) (p[2]-p[1]) * (p[4]-p[3])
fbnd <- function(p) {
    c(0.05 - sum(x < p[1] | x > p[2] | y < p[3] | y > p[4]) / N,
      q1 - p[1], p[2] - q2,
      q3 - p[3], p[4] - q4 )
}

作为起点,我们可以取x坐标和y坐标的范围。

代码语言:javascript
复制
start <- c(range(x), range(y))

优化求解器必须最小化具有非线性约束的函数。软件包nloptr中的auglag例程是候选求解器。

代码语言:javascript
复制
S <- nloptr::auglag(start, fn=fmin, hin=fbnd)
S$par; S$value
# [1] -2.301263  2.308038 -2.079166  2.130744
# [1] 19.40474

我们可以通过将矩形边界移动到下一个上或下x- resp来改进解。Y坐标。这是一个必要的步骤,因为目标函数是局部恒定的。

代码语言:javascript
复制
r <- S$par
r[1] <- min(x[x >= r[1]]); r[2] <- max(x[x <= r[2]])
r[3] <- min(y[y >= r[3]]); r[4] <- max(y[y <= r[4]])
r
# [1] -2.299467  2.281395 -2.079166  2.127260

我们可以看到,50点在长方形之外,面积是19.26905。

代码语言:javascript
复制
(r[2]-r[1]) * (r[4]-r[3])                          # 19.26905
sum(x < r[1] | x > r[2] | y < r[3] | y > r[4])     # 50

解决方案可能仍然是一个局部的最低限度。幸运的是,目标函数也是局部单调的,因此通常不会发生这种情况。当然,可以通过应用全局求解器来验证解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44069854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档