Объединение двух векторов разных диапазонов с использованием R

Я пытаюсь оценить производительность простой модели прогнозирования с использованием 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)

Мне нужно выполнить binning здесь. Во-первых, значения «фактического» факторизуются/дискретизируются по разным уровням, например: 0-5: Уровень 1 ** 6-10: Уровень 2 ** ... ** 41-45: Уровень 9

Теперь я должен также поместить значения «прогнозируемого» в вышеупомянутые корзины. Я попытался добиться этого с помощью функции cut() в R:

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

Однако, если вы видите, что второй элемент в прогнозируемом (98.01) помечен как 5, но на самом деле он не попадает в желаемый интервал. Я чувствую, что использование другого binCount для прогнозируемого не поможет. Кто-нибудь может предложить решение для этого?


person Sailesh    schedule 01.10.2014    source источник
comment
cut(x=predicted, breaks=binCount) делит диапазон «x» на интервалы binCount одинакового размера (наберите summary(predicted), чтобы увидеть этот диапазон). Поскольку predicted включает 98.01, по определению он будет в интервале (а поскольку это максимальное значение, он будет в интервале 5). Я думаю, вы хотели, чтобы разрывы binPred были такими же, как binActual, т.е. 5 бинов от 0,00 до 41,00. Затем, в какой бин нужно «вырезать (прогнозировать, ...)» поместить значения › 41? Должен ли он дать NA? открытый интервал справа для ›= 41? Отдельная дополнительная корзина [41,∞)? Вам нужно решить, какой результат вы хотите.   -  person smci    schedule 17.09.2018


Ответы (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

Я не уверен, что это то, что вы ищете, поэтому дайте мне знать, возможно, я смогу вам помочь. С наилучшими пожеланиями.

person probaPerception    schedule 01.10.2014
comment
Спасибо! очень признателен :) - person Sailesh; 06.10.2014

Это то, что вы хотите?

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
person Lars Lau Raket    schedule 01.10.2014