【问题标题】:How to return possible pairs of variables based on a function?如何根据函数返回可能的变量对?
【发布时间】:2019-08-15 08:18:28
【问题描述】:

我有一对变量(x,y),每个变量都有一个可能的值范围(xmin,xmax 和 ymin,ymax)。我正在寻找这样的对,它们基于一个函数会产生相同的概率。

这是我的函数,它会返回概率。

f <- function(x, y) 1-exp(-(x^(1/0.9)+y^(1/0.9))^0.9)

现在假设我想知道对于某个概率,比如 0.01,产生该概率的 x 和 y 的可能变量对是什么(考虑到它们的约束、最小值和最大值)。

(我已经尝试过反过来做整个事情,首先为 x 和 y 创建一个矩阵,然后为每个组合计算概率,但是我需要在矩阵中找到相同的概率,这似乎更加困难。)

【问题讨论】:

  • 我认为您仍然需要计算所有概率才能找出具有一定值(0.01)的概率。如果matrix2 是所有概率组合的矩阵,你可以做mat &lt;- which(matrix2 == 0.01, arr.ind = TRUE) 并得到组合做data.frame(comb1 = rownames(matrix2)[mat[, 1]], comb2 = colnames(matrix2)[mat[, 2]]) 这对你有用吗?
  • 我明白你的意思,这是个好主意,我认为它会起作用,唯一的问题是我的矩阵中的概率不是整数,所以 R 不会找到 0.01。我想在那里指出一个范围,比如 0.01 加负 0.0001。如何将其添加到第一个命令?感谢您的帮助!
  • 如果给定 x(好的旧纸和铅笔),您可以通过分析找到 y 产生所需的概率,然后以小步长在 min 和 max 之间循环 x 值并找到相应的 y。最后检查 y 是否在所需范围内,以了解您是否保留该对。这可能真的更快,因为您在计算矩阵时只求解一维而不是二维。

标签: r


【解决方案1】:

所以通过做一些数学运算(抱歉,SO 不支持乳胶格式):

P=1-exp(-(x^(1/0.9)+y^(1/0.9))^0.9)

ln(1-P)=-(x^(1/0.9)+y^(1/0.9))^0.9)

(-ln(1-P))^(1/0.9)-y^(1/0.9)=x^(1/0.9)

((-ln(1-P))^(1/0.9)-y^(1/0.9))^0.9=x

现在如果我们把它放在一些 R 代码中,并检查结果何时不存在:

get_x <- function(P,y)
{
  x=((-log(1-P))^(1/0.9)-y^(1/0.9))^0.9
  # Verification of the results
  # If results no real (then x[i]=NaN) or if it does
  # not match the given probability (should never happens)
  # the results is set to NaN
  # This verification is for debugging only, should be removed
  for (i in c(1:length(y))){
    if(is.na(x[i]) | abs(P-1+exp(-(x[i]^(1/0.9)+y[i]^(1/0.9))^0.9))>0.00001)
    {
      x[i]=NaN
      print(paste0("Oops, something went wrong with y=",y[i]))
    }
  }
  return(x)
}

y_values=seq(0.01,0.99,by=0.001)
get_x(0.09,y_values)

这相当快,现在只使用了一个循环,而不是两个来填充矩阵,所以订购 n 而不是 n^2

【讨论】:

  • 是的,现在很清楚了。令人困惑的是,我没有像你那样重新排列公式。代码很清楚,我刚刚运行它,它工作正常!再次感谢!
【解决方案2】:

我们可以计算所有可能组合的概率,并创建一个数据框,其组合满足我们的标准并具有一定的容差(用于浮点比较)

tol <- 0.0001
mat <- which((matrix2 >= 0.01 - tol) & (matrix2 <= 0.01 + tol), arr.ind = TRUE)
data.frame(comb1 = rownames(matrix2)[mat[, 1]], comb2 = colnames(matrix2)[mat[, 2]])

【讨论】:

  • 非常感谢!这正是我需要的:)
  • 这行得通,但是如果你事先做一些数学运算,你可以用更少的计算得到更准确的解决方案
  • @Chelmy88 所以我也在尝试按照你的建议去做。我这样做了,但由于某种原因它不起作用,你能帮帮我吗?谢谢 probab
  • 以及如何在循环中执行此操作(对于一系列概率值)将是另一回事......
  • @AttilaBorsos 看看我的新答案,你的数学可能有问题
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2022-11-21
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2021-02-10
相关资源
最近更新 更多