基于一组没有目标的测量值创建索引以进行排序

机器算法验证 排行
2022-03-22 02:58:37

我在这里尝试解决的问题非常简单,但可用数据非常有限。这使它成为一个难以解决的问题。

可用数据如下:

  1. 我有 100 名患者,我需要根据他们的健康程度对他们进行排序。
  2. 我对每个病人只有 5 次测量。五个读数中的每一个都被编码为一个数值,规则是读数越大,患者越健康。

如果我有某种医生的“基于专家判断的排名”,我可以将其用作目标变量并拟合某种试图预测医生评估的序数逻辑回归模型。但是,我没有那个。我唯一拥有的是(1)和(2)。

您将如何想出一个简单的“评分”算法,将这五个测量值组合成一个分数,在对患者进行排序时足够好(不完美)?

4个回答

任何功能f:R5R在其每个论点中单独增加将起作用。例如,您可以选择正参数αi和任何实际参数λi并对数据进行排序(x1,x2,x3,x4,x5)根据价值观

i=15αi(xiλi1)/λi.

显然需要一些标准来在如此丰富的一组明显不同的分数中进行选择。特别是,简单明显的解决方案(不幸的是,经常使用)只是对分数求和或首先以某种方式“标准化”它们然后对它们求和,这将受到缺乏现实基础的影响。换句话说:任何不从额外信息中获得支持的答案都是纯属捏造的。

因为这个问题本质上与从多个变量创建质量指数以启用排名排序相同,所以我建议您参考那里的讨论以获取更多信息。

一种简单的方法是计算总分或平均值。另一种方法不会假设所有变量都同等重要,我们可以计算加权平均值。

假设我们有以下 10 名患者和变量v1v5

> set.seed(1)
> df <- data.frame(v1 = sample(1:5, 10, replace = TRUE),
+                  v2 = sample(1:5, 10, replace = TRUE),
+                  v3 = sample(1:5, 10, replace = TRUE),
+                  v4 = sample(1:5, 10, replace = TRUE),
+                  v5 = sample(1:5, 10, replace = TRUE))
> 
> df
   v1 v2 v3 v4 v5
1   2  2  5  3  5
2   2  1  2  3  4
3   3  4  4  3  4
4   5  2  1  1  3
5   2  4  2  5  3
6   5  3  2  4  4
7   5  4  1  4  1
8   4  5  2  1  3
9   4  2  5  4  4
10  1  4  2  3  4

1.总分和排名

> df$sum <- rowSums(df)
> df$ranks <- abs(rank(df$sum) - (dim(df)[1] + 1))
> df
   v1 v2 v3 v4 v5 sum ranks
1   2  2  5  3  5  17   4.0
2   2  1  2  3  4  12   9.5
3   3  4  4  3  4  18   2.5
4   5  2  1  1  3  12   9.5
5   2  4  2  5  3  16   5.0
6   5  3  2  4  4  18   2.5
7   5  4  1  4  1  15   6.5
8   4  5  2  1  3  15   6.5
9   4  2  5  4  4  19   1.0
10  1  4  2  3  4  14   8.0

2. 平均分和排名(注:ranksranks2是相等的)

> df$means <- apply(df[, 1:5], 1, mean)
> df$ranks2 <- abs(rank(df$mean) - (dim(df)[1] + 1))
> df
   v1 v2 v3 v4 v5 sum ranks means ranks2
1   2  2  5  3  5  17   4.0   3.4    4.0
2   2  1  2  3  4  12   9.5   2.4    9.5
3   3  4  4  3  4  18   2.5   3.6    2.5
4   5  2  1  1  3  12   9.5   2.4    9.5
5   2  4  2  5  3  16   5.0   3.2    5.0
6   5  3  2  4  4  18   2.5   3.6    2.5
7   5  4  1  4  1  15   6.5   3.0    6.5
8   4  5  2  1  3  15   6.5   3.0    6.5
9   4  2  5  4  4  19   1.0   3.8    1.0
10  1  4  2  3  4  14   8.0   2.8    8.0

3.加权平均分(即我假设V3和V4比v1、v2或v5更重要)

> weights <- c(0.5, 0.5, 1, 1, 0.5)
> wmean <- function(x, w = weights){weighted.mean(x, w = w)}
> df$wmeans <- sapply(split(df[, 1:5], 1:10), wmean)
> df$ranks3 <- abs(rank(df$wmeans) - (dim(df)[1] + 1))
> df
   v1 v2 v3 v4 v5 sum ranks means ranks2   wmeans ranks3
1   2  2  5  3  5  17   4.0   3.4    4.0 3.571429    2.5
2   2  1  2  3  4  12   9.5   2.4    9.5 2.428571    9.0
3   3  4  4  3  4  18   2.5   3.6    2.5 3.571429    2.5
4   5  2  1  1  3  12   9.5   2.4    9.5 2.000000   10.0
5   2  4  2  5  3  16   5.0   3.2    5.0 3.285714    5.0
6   5  3  2  4  4  18   2.5   3.6    2.5 3.428571    4.0
7   5  4  1  4  1  15   6.5   3.0    6.5 2.857143    6.0
8   4  5  2  1  3  15   6.5   3.0    6.5 2.571429    8.0
9   4  2  5  4  4  19   1.0   3.8    1.0 4.000000    1.0
10  1  4  2  3  4  14   8.0   2.8    8.0 2.714286    7.0

我只是简单地总结它们,必要时对每个因素进行加权。

先生成一个合成二元目标变量然后运行逻辑回归模型怎么样?

合成变量应该类似于...“如果观察值在所有输入变量分布的前十分位中,则将其标记为 1,否则为 0”

生成了二进制目标变量...运行逻辑回归以得出概率度量 0 到 1,以评估多个分布观察的尾部有多远/多近?