如果我只有关于哪个值离一对值更近的数据,我如何近似 "hidden" 值?

How do i approximate a "hidden" value if i only have data about which is closer from a pair of values?

首先,很抱歉标题乱七八糟,我不确定如何更准确地表述问题。

这是问题所在:

我正在寻找 一个 介于 0 和 1 之间的值,我们称它为 X。

我拥有的信息是一个包含 3 列的数据框。前两列是介于 0 和 1 之间的值,第三列包含有关哪个值更接近 X 的信息。

这是一个示例 df(真实数据帧包含大约 1500 个这样的对)

value 1 | value 2 | closer to x
--------|---------|--------
  0.3   |   0.5   |   2
  0.15  |   0.8   |   1
  0.4   |   0.7   |   1
  0.5   |   0.6   |   1
  0.1   |   0.2   |   2
  0.2   |   0.5   |   2
  0.4   |   0.9   |   1

是否有函数或任何方法可以近似值 X 是多少?数据集也可能包含小的测量误差,因此如果 99% 的 value-pairs 适用于 x=0.41 而 1% 不适用于 x=0.41,它仍然有用。

我很感谢任何解决方案或只是我可以找到解决方案的方向。谢谢

编辑:澄清一下:数据框中的所有(或至少大部分)对都指向一个值 X。

# Creating a tyo data set
# value1 is always lower than value2
library(tidyverse)
set.seed(666)
dat <- data.frame(value1 = round(seq(0, 0.3, length.out = 10), 1),
                  value2 = round(seq(0.4, 1, length.out = 10), 1),
                  closer = round(runif(10, 1, 2), 0))

# Simply creating a random uniform variable constraint to the bounds of being closer to the value variable mentioned in "closer" and 1
dat %>%
  mutate(constraint = value2 - (value2 - value1)/2,
         min        = if_else(closer == 1, 0, constraint),
         max        = if_else(closer == 1, constraint, 1),
         new_x      = runif(10, min = min, max = max))

给出:

   value1 value2 closer constraint  min  max      new_x
1     0.0    0.4      2       0.20 0.20 1.00 0.57582283
2     0.0    0.5      1       0.25 0.00 0.25 0.09940414
3     0.1    0.5      1       0.30 0.00 0.30 0.24139102
4     0.1    0.6      1       0.35 0.00 0.35 0.17811408
5     0.1    0.7      1       0.40 0.00 0.40 0.25396614
6     0.2    0.7      2       0.45 0.45 1.00 0.72183845
7     0.2    0.8      1       0.50 0.00 0.50 0.14006545
8     0.2    0.9      2       0.55 0.55 1.00 0.95891966
9     0.3    0.9      1       0.60 0.00 0.60 0.47046969
10    0.3    1.0      1       0.65 0.00 0.65 0.36334806

如果您不想保留临时列,您可以在管道中取消select它们,例如

dat %>%
  mutate(constraint = value2 - (value2 - value1)/2,
         min        = if_else(closer == 1, 0, constraint),
         max        = if_else(closer == 1, constraint, 1),
         new_x      = runif(10, min = min, max = max)) %>%
 select(-constraint, -min, -max)

好吧,以防万一有人遇到任何类似的问题并想知道我最终是如何解决我的问题的(并不是说这是一个完美的解决方案,但对于我正在做的事情来说已经足够好了):

我生成了两点之间的平均值,因为巴黎提供的信息是值 X 比该对的平均值 bigger/smaller(取决于“更接近 x”的值)。

df$mean <- (df$value1 + df$value2 )/2

然后我只是写了一个循环,对于 x 的所有可能值,以 0.001 为增量检查 x 的值是否适用于所有可能的对,并输出该值 x 适合的对数。

xtab <- NA
for (i in 1:1000){
  valuex <- 0+0.001*i
  sumofx <- sum(df$mean[df$closertox == 2] < valuex )+
    sum(df$mean[df$closertox == 1] > valuex )
  xtab <<- rbind(xtab,c(valuex,sumofx))
}
xtab <- xtab[-c(1),]

然后我绘制这些值得到:

plot(xtab)

使用此图并查看值本身,我确定我的对的值 X 可能在 0.57 到 0.58 之间。