Добавление регулируемого случайного шума к матрице в R

#r #function #dataframe #matrix #random

#r #функция #фрейм данных #матрица #Случайный

Вопрос:

У меня есть функция генерации матрицы, которая создает нижний треугольник 1 s и верхний треугольник 0s .

Мне было интересно, возможно ли добавить некоторый регулируемый случайный шум (из некоторого распределения, которое дает случайное 0 и 1 ) к выводимой матрице, чтобы случайные 0 s случайным образом заменяли некоторые из нижних 1 s, а случайные 1 s случайным образом заменяли некоторые из верхних 0 s?

 lower_mat <- function(r, c) {
  m <- matrix(0, nrow=r,ncol=c)
  m[lower.tri(m)] <- 1
  m
}


lower_mat(5,4)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    0
# [2,]    1    0    0    0
# [3,]    1    1    0    0
# [4,]    1    1    1    0
# [5,]    1    1    1    1
  

Ответ №1:

Если вы хотите предположить, что вы меняете местами с нижнего на верхний определенное количество позиций, вы могли бы сделать

 swap_upper_lower <- function(m, n) {
  tops <- which(upper.tri(m))
  bots <- which(lower.tri(m))
  stopifnot(length(bots)>=n amp;amp; length(tops)>=n)
  tops <- sample(tops, n)
  bots <- sample(tops, n)
  vals <- m[tops]
  m[tops] <- m[bots]
  m[bots] <- vals
  m
}

mm <- lower_mat(5,4)
swap_upper_lower(mm, 3)
  

Это поменяет местами 3 значения из нижнего треугольника в верхний треугольник

Если вы предпочитаете думать об этом как о замене позиций 0 и 1, вы могли бы вместо этого сделать

 swap_0_1 <- function(m, n) {
  ones <- which(m==1)
  zers <- which(m==0)
  stopifnot(length(ones)>=n amp;amp; length(zers)>=n)
  ones <- sample(ones, n)
  zers <- sample(zers, n)
  vals <- m[ones]
  m[ones] <- m[zers]
  m[zers] <- vals
  m
}
  

Обратите внимание, что это будет обрабатывать значения по диагонали иначе, чем другая функция.