Комбинированные матрицы с условиями и взвешенными данными в R

Допустим, у меня 5 болезней (а, б, в, г, д). Каждому человеку в выборке задавали вопрос, есть ли у него каждое из заболеваний, а затем присваивали вес (W). Мне нужно определить долю каждой комбинации болезней в популяции. Это может включать комбинации, в которых люди отвечают (1,1) для любой комбинации болезней.

df <- data.frame(
  a = c(1, 1, 0, 0),
  b = c(1, 1, 0, NA),
  c = c(0, 1, NA, 1),
  d = c(1, 1, 0, 1  ),
  e = c(1, 1, 1, 0  ),
  W = c(1.5,3.5,2.5,2.3))

df
  a  b  c d e   W
1 1  1  0 1 1 1.5
2 1  1  1 1 1 3.5
3 0  0 NA 0 1 2.5
4 0 NA  1 1 0 2.3

Я смог понять это, чтобы получить матрицу:

DisDyads <- apply (df, 2, function (x) colSums (df == 1 & x == df, na.rm = TRUE))

  a b c d e W
a 2 2 1 2 2 0
b 2 2 1 2 2 0
c 1 1 2 2 1 0
d 2 2 2 3 2 0
e 2 2 1 2 3 0
W 0 0 0 0 0 0

Как вместо этого превратить их в пропорции?

Это пример того, как будут выглядеть 1-я и 2-я строки вывода матрицы при правильных условиях и пропорциях:

   a    b    c     d    e    W
a  0.5  0.5  0.25  0.5  0.5  0
b  0.5  0.5  0.25  0.5  0.5  0

Далее мне также необходимо учитывать веса при определении доли каждой комбинации на уровне популяции.

Может кто-нибудь, пожалуйста, помогите мне понять это? Что, если бы я пытался найти соотношение трех комбинаций болезней? Пример. доля людей, у которых есть a,b,c и a,b,d и так далее..

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


person user9660254    schedule 17.04.2018    source источник
comment
Каков алгоритм расчета этих пропорций (и весов)?   -  person Roman Luštrik    schedule 17.04.2018
comment
Просто умножьте каждого человека на его вес, а затем разделите на (nrow(df)*sum(df$W) @RomanLuštrik   -  person user9660254    schedule 17.04.2018
comment
Возможно, вам придется проанализировать это по-другому и/или просмотреть данные по-другому. Ваши данные не являются независимыми, поэтому вы не можете обращаться с ними как с таковыми. Вы считаете случаи каждой болезни отдельно, чего не следует делать, у вас нет случаев только одной болезни. Придумайте свои комбинации (для краткости я просто показываю a, b и c): a, b, c, ab, ac, bc, abc. Затем ваши ответы для каждого пациента: 1, 2, 3, 4. Вы не можете изобразить это в матрице комбинаций, которые показывают попарные комбинации.   -  person Anonymous coward    schedule 17.04.2018
comment
В данном случае я не считаю возникновение каждого заболевания отдельно. а и а, присутствующие вместе в матрице, просто означают, что это пропорция наличия этой болезни, даже если у вас может быть другая болезнь. Очень неэффективно делать комбинации одну за другой. Это просто пример... в моем фактическом наборе данных гораздо больше болезней. @анонимный трус   -  person user9660254    schedule 18.04.2018


Ответы (1)


О, кажется, теперь я вижу. Вы хотите, по сути, создать таблицу поиска с кросс-таблицей. Это не будет легко показать. Он будет большим, так как вам нужно будет отображать все комбинации и иметь много дубликатов.

Что касается их пропорций, вы просто разделите весь свой фрейм данных (кроме столбца W) на nrow, а затем умножите строки на пропорциональные веса (W/sum(W)):

df[,1:5] <- df[,1:5]/nrow(df)

Чтобы умножить ваши веса, потребуется некоторое манипулирование.

df <- as.matrix(df)
df <- as.data.frame(t(t(df[,1:5]*(df[,6] / sum(df[,6]))))) # this subsets your data, and multiplies each cell in cols 1:5 by the proportional weights.


       a          b          c          d          e
1 0.03826531 0.03826531 0.00000000 0.03826531 0.03826531
2 0.08928571 0.08928571 0.08928571 0.08928571 0.08928571
3 0.00000000 0.00000000         NA 0.00000000 0.06377551
4 0.00000000         NA 0.05867347 0.05867347 0.00000000

Я думаю, вы могли бы просто получить свои взвешенные значения, а затем пойти оттуда. Разве комбинации не должны быть просто аддитивными?

person Anonymous coward    schedule 17.04.2018
comment
Я смог использовать следующее, чтобы получить взвешенную долю каждой комбинации болезней: Диады ‹- применить (df, 2, function (x) colSums (((df == 1 & x == df)* df$W) , na.rm = TRUE)) Dyads_w ‹- Dyads/sum(data4$Weights)*100 Теперь я пытаюсь выяснить, как определить долю трех комбинаций заболеваний. Я понимаю, что не могу использовать ту же методологию, что и для двух комбинаций болезней. Любые идеи о том, как подойти к этому? Я очень ценю помощь :) - person user9660254; 18.04.2018