Алгоритм для генерации всех возможных популяций по 5-шкале Лайкерта в R (кумулятивная частота на уровень на 0,1) - PullRequest
1 голос
/ 19 февраля 2020

Я хотел бы сгенерировать все возможные популяции по шкале 5-Ликерта, значения которых представляют собой совокупную частоту (0,1 на каждом уровне), например:

[1] [2]  [3]  [4]  [5]
1    0    0    0    0
0    1    0    0    0
         ...
0    0    0    0    1
0.9  0.1  0    0    0
0.9  0   0.1   0    0
         ...
0.8 0.2   0    0    0
0.8  0    0.2  0    0
         ...
0.8 0.1  0.1   0    0

и т. Д. *

Я пробовал с некоторыми элементарными циклами, такими как:

fin <- NULL
for (i in 1:10) {
  a <- c(1-(i/10),0,0,0,0)
  fin <- c(fin,a)
  for (j in 1:10) {
    b <- c(a[1],(j/10),0,0,0)
    fin <- c(fin,b)
    for (k in 1:10) {
      c <- c(a[1],b[2],k/10,0,0)
      fin <- c(fin,c)
      for (l in 1:10) {
        d <- c(a[1],b[2],c[3],l/10,0)
        fin <- c(fin,d)
        for (m in 1:10) {
          e <- c(a[1],b[2],c[3],d[4],m/10)
          fin <- c(fin,e)
        }
      }
    }
  }
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))
head(dat)

a <- NULL
for (i in 1:111110) {
  if(rowSums(dat[i,])==1)
  {b <- dat[i,]
  a <- c(a,b)}
  else{
    next
    }
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))

Я знаю, что это не умно и не эффективно, но строки, где sum = 1 - это некоторые из случаев, которые я хочу иметь, но этого недостаточно.

Я действительно ценю любую помощь. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Используйте expand.grid, чтобы сначала сгенерировать все комбинации, а затем отфильтровать (например, используя dplyr) только те строки, в которых сумма равна единице:

levels <- seq(0,1, 0.1)

expand.grid(L1 = levels,
            L2 = levels,
            L3 = levels,
            L4 = levels,
            L5 = levels) %>% 
  dplyr::mutate(sum = L1+L2+L3+L4+L5) %>% 
  dplyr::filter(sum == 1) %>%
  dplyr::select(-sum)

2 голосов
/ 19 февраля 2020

Создать вектор, содержащий все допустимые значения

values <- seq(0, 1, by=0.1)
values

Возвращает:

[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Используя базу R expand.grid, чтобы получить все возможные комбинации этих значений для пяти переменных:

df <- expand.grid(A1 = values, A2 = values, A3 = values, A4 = values, A5 = values)

Рассчитать мудрую сумму строк, используя rowSums:

df$TestSum <- rowSums(df)

Сохранять только те строки, для которых TestSum равен 1 (а также сохранять только первые 5 столбцов, столбец TestSum нам не нужен больше):

result <- df[df$TestSum == 1, 1:5]

head(result)

Возвращает:

    A1  A2 A3 A4 A5
11 1.0 0.0  0  0  0
21 0.9 0.1  0  0  0
31 0.8 0.2  0  0  0
41 0.7 0.3  0  0  0
51 0.6 0.4  0  0  0
61 0.5 0.5  0  0  0
...