使用R将两个不同范围的向量合并

时间:2014-10-01 11:19:24

标签: r binning

我尝试使用R评估简单预测模型的性能,方法是通过将预测结果分类为定义的间隔来离散预测结果,然后将它们与相应的实际值(分箱)进行比较。

我有两个向量 实际 预测 ,如下所示:

> actual <- c(0,2,0,0,41,1,3,5,2,0,0,0,0,0,6,1,0,0,15,1)
> predicted <- c(3.38,98.01,3.08,4.89,31.46,3.88,4.75,4.64,3.11,3.15,3.42,10.42,3.18,5.73,4.20,3.34,3.95,5.94,3.99)

我需要在这里执行分箱。首先,&#39;实际&#39;被分解/离散化到不同的水平,比如说: 0-5:等级1 ** 6-10:等级2 ** ...... ** 41-45:等级9

现在,我已经预测了&#39;预测&#39;也进入上面提到的水桶。 我尝试使用R中的 cut() 函数实现此目的:

binCount <- 5
binActual <- cut(actual,labels=1:binCount,breaks=binCount)
binPred <- cut(predicted,labels=1:binCount,breaks=binCount)

但是,如果你看到预测中的第二个元素(98.01)被标记为5,但它实际上并没有落在所需的时间间隔内。 我觉得为 预测 使用不同的 binCount 将无济于事。任何人都可以为此建议一个解决方案吗?

2 个答案:

答案 0 :(得分:2)

我不能100%确定你想做什么。

但是根据我的理解,你想要为每个向量的每个元素返回它所在的类。给定一组类,它考虑实际和预测的两个向量中的任何一个值。

如果这是你想要做的,那么你的脚本(如你所说)为0到45之间的值创建类。通过这个剪切,你可以对第一个向量进行分类。

然后为预测的向量创建一组新类。 分类不再相同了。

假设我明白你想做什么,我宁愿写:

actual <- c(0,2,0,0,41,1,3,5,2,0,0,0,0,0,6,1,0,0,15,1)
predicted <- c(3.38,98.01,3.08,4.89,31.46,3.88,4.75,4.64,3.11,3.15,3.42,10.42,3.18,5.73,4.20,3.34,3.95,5.94,3.99)

temporary = c(actual, predicted)
maxi <- max(temporary)
mini <- min(temporary)
binCount <- 5
s <- seq(maxi, mini, length.out = binCount)
s = sort(s)

binActual <- cut(actual,breaks=s, include.lowest = T, labels = 1:(length(s)-1))
binPred <- cut(predicted,breaks=s, include.lowest = T, labels = 1:(length(s)-1))

它给出了:

> binActual
 [1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 1 2 3 4

> binPred
 [1] 1 4 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 1 2 3 4

我不确定这是你在寻找什么,所以让我知道,我也许可以帮助你。 祝福。

答案 1 :(得分:0)

这是你想要的吗?

intervals <- cbind(seq(0, 40, length = 9), seq(5, 45, length = 9))

cutFixed <- function(x, intervals) {
    sapply(x, function(x) ifelse(x < min(intervals) | x >= max(intervals), NA, which(x >= intervals[,1] & x < intervals[,2])))
}

这给出了以下结果

> cutFixed(actual, intervals)
 [1] 1 1 1 1 9 1 1 2 1 1 1 1 1 1 2 1 1 1 4 1
> cutFixed(predicted, intervals)
 [1]  1 NA  1  1  7  1  1  1  1  1  1  3  1  2  1  1  1  2  1