Как выбрать неполные таблицы на вкладке 3d-непредвиденных обстоятельств? - PullRequest
1 голос
/ 11 октября 2019

Это похоже на новый вопрос, но я просто не могу понять это. Я просматриваю трехмерную таблицу непредвиденных обстоятельств и хочу провести анализ неполных таблиц. Ниже приведены некоторые примеры данных:

df2 <- data.frame(Gender = c(rep("M", 6), rep("F", 6)), Beliefs = c(rep("Fund", 2), rep("Mod", 2), rep("Liberal", 2), rep("Fund", 2), rep("Mod", 2), rep("Liberal", 2)), Afterlife = c(rep(c("Yes", "No"), 6)), Count = c(252, 43, 274, 47, 226, 100, 420, 50, 415, 50, 273, 83))

df2.tab <- xtabs(Count ~ Beliefs + Afterlife + Gender, data = df2)

Изначально пол был моей переменной Z. Но я хочу сравнить отдельные таблицы по уровням убеждений. Конечно, я могу создать xtabs с верованиями в качестве моей переменной группировки, но даже тогда я не могу понять, как выбрать отдельные таблицы (или уровень Z) независимо, чтобы найти OR для каждой частичной таблицы, например, используяepitools :: oddsratio.wald

Большое спасибо!

1 Ответ

1 голос
/ 11 октября 2019

Вот попытка объяснить, как apply может быть полезна здесь, на примере:

printchk <- function(x) {print(x); print(class(x)); cat("------\n")}
tab <- array(1:8,dim=c(2,2,2))
printchk(tab)
#, , 1
#
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
#
#, , 2
#
#     [,1] [,2]
#[1,]    5    7
#[2,]    6    8
#
#[1] "array"
#------

Работа с объединенными рядами по слоям

invisible(apply(tab, 1, printchk))
#     [,1] [,2]
#[1,]    1    5
#[2,]    3    7
#[1] "matrix"
#------
#     [,1] [,2]
#[1,]    2    6
#[2,]    4    8
#[1] "matrix"
#------

Работа с объединенными столбцами по слоям

invisible(apply(tab, 2, printchk))
#     [,1] [,2]
#[1,]    1    5
#[2,]    2    6
#[1] "matrix"
#------
#     [,1] [,2]
#[1,]    3    7
#[2,]    4    8
#[1] "matrix"
#------

Работа со слоями

invisible(apply(tab, 3, printchk))
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
#[1] "matrix"
#------
#     [,1] [,2]
#[1,]    5    7
#[2,]    6    8
#[1] "matrix"
#------

Таким образом, без изменения размеров или структуры, вы можете сравнивать различные части массива, используя вызовы apply.

oddsratio <- function(x) (x[1,1]/x[2,1]) / (x[1,2]/x[2,2])

apply(tab, 1, oddsratio)
##Expecting: (1/3)/(5/7) = 0.46
##           (2/4)/(6/8) = 0.66

#[1] 0.4666667 0.6666667

Да, работает как задумано.

Несколько измерений

Затем можно расширить эту логику, чтобы использовать несколько измерений одновременно, например:

invisible(apply(tab, c(1,2), printchk))
#[1] 1 5
#[1] "integer"
#------
#[1] 2 6
#[1] "integer"
#------
#[1] 3 7
#[1] "integer"
#------
#[1] 4 8
#[1] "integer"
#------
...