выборка ячеек из строк матрицы на основе значений ячеек - PullRequest
0 голосов
/ 24 сентября 2019

Матрица 10x10 содержит «правдоподобия» для любой ячейки, выбранной в данной строке во время розыгрыша.

        id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
id1     NA  0.5 0.7 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id2     0.5 NA  0.5 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id3     0.7 0.5 NA  0.5 0.5 0.4 0.4 0.4 0.4 0.4
id4     0.5 0.5 0.5 NA  0.5 0.4 0.4 0.4 0.4 0.4
id5     0.5 0.5 0.5 0.5 NA  0.4 0.4 0.4 0.4 0.4
id6     0.4 0.4 0.4 0.4 0.4 NA  0.5 0.7 0.5 0.5
id7     0.4 0.4 0.4 0.4 0.4 0.5 NA  0.5 0.5 0.5
id8     0.4 0.4 0.4 0.4 0.4 0.7 0.5 NA  0.5 0.5
id9     0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 NA  0.5
id10    0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 NA

Каждый розыгрыш выполняется строкой, и вероятность выбора ячейки является значениемэтой ячейки, деленная на сумму всех значений ячейки в данной строке.Например, мне нужно выбрать ячейку от id2 до id10 в строке id1.Наиболее вероятный выбор - id3, поскольку его значение 0.7 является самым высоким в строке.

Мне нужен вектор с именем result, в котором сохраняется выбор для каждой строки после выбора.Мой текущий план состоит в том, чтобы:

  1. суммировать по строкам и сохранить результаты в виде вектора denom
  2. создать случайную равномерную переменную между 0 и этой суммой для каждой строки
  3. если значение находится в диапазоне от 0,0 до 0,5, выбранный человек в строке 1 равен id2;если 0.51-1.20, выбранный человек - id3 ... и т. д.

Это, очевидно, слишком много работы.Что может быть лучше для выборки с весами, игнорируя значения NA по диагонали?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Вы можете использовать apply с sample, чтобы случайным образом выбрать элемент из каждой строки.Мы создаем пользовательскую функцию, которая переносит sample для обработки пропущенных значений по диагонали и использования правильных весов.Одна удобная вещь состоит в том, что после удаления пропущенных значений с помощью na.omit у результирующего вектора все еще есть имена, поэтому мы можем выбирать имена, используя соответствующие вероятности в качестве весов с аргументом prob.

mat <- as.matrix(read.table(
text = "id1 id2 id3 id4 id5 id6 id7 id8 id9 id10
id1  NA  0.5 0.7 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id2  0.5 NA  0.5 0.5 0.5 0.4 0.4 0.4 0.4 0.4
id3  0.7 0.5 NA  0.5 0.5 0.4 0.4 0.4 0.4 0.4
id4  0.5 0.5 0.5 NA  0.5 0.4 0.4 0.4 0.4 0.4
id5  0.5 0.5 0.5 0.5 NA  0.4 0.4 0.4 0.4 0.4
id6  0.4 0.4 0.4 0.4 0.4 NA  0.5 0.7 0.5 0.5
id7  0.4 0.4 0.4 0.4 0.4 0.5 NA  0.5 0.5 0.5
id8  0.4 0.4 0.4 0.4 0.4 0.7 0.5 NA  0.5 0.5
id9  0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 NA  0.5
id10 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 NA"
))

foo <- function(row) {
  no_na <- na.omit(row)
  sample(x = names(no_na), size = 1, prob = no_na)
}

result <- apply(mat, 1, foo)
result
#>    id1    id2    id3    id4    id5    id6    id7    id8    id9   id10 
#>  "id2"  "id9"  "id4"  "id2"  "id3"  "id8"  "id8" "id10"  "id3"  "id7"

Создано в 2019-09-24 пакетом Представ (v0.3.0)

0 голосов
/ 24 сентября 2019

Я думаю, что вам нужно, это sample функция https://www.rdocumentation.org/packages/base/versions/3.6.1/topics/sample

...