Неточные проценты в таблице expss
Я анализирую некоторые данные опроса и использую expss
создавать таблицы.
Один из наших вопросов касается узнаваемости бренда. У меня есть 3 типа брендов: BrandA - это бренд, который видит большое подмножество образца, BrandB - это бренд, который видит меньшее (взаимоисключающее!) Подмножество образца, а BrandC - это бренд, который видит каждый респондент.
Я хотел бы рассматривать этот вопрос об осведомленности как вопрос с несколькими ответами и сообщить процент людей (которые действительно видели бренд), которые осведомлены о каждом бренде. (В этом случае значение 1 означает, что респондент был осведомлен о бренде.)
Самое близкое, что я могу получить, это использовать приведенный ниже код, но tab_stat_cpct()
не сообщает точный процент или количество случаев, как вы можете видеть в прилагаемой таблице. Когда вы сравниваете Общий%, указанный в таблице, с общим%, вычисленным вручную (т. Е. Через mean(data$BrandA, na.rm = TRUE)
), он сообщает значения, которые являются слишком низкими для BrandA и BrandB, и значения, которые являются слишком высокими для BrandC. (Не говоря уже о том, что общее количество дел должно быть 25.)
Я прочитал документацию, и я понимаю, что эта проблема связана с тем, как tab_stat_cpct()
определяет "случай" для целей вычисления процента, но я не вижу аргумента, который приспособит это определение к тому, что мне нужно. Я что-то пропустил? Или есть какой-то другой способ сообщить точные проценты? Спасибо!
set.seed(123)
data <- data.frame(
Age = sample(c("25-34", "35-54", "55+"), 25, replace = TRUE),
BrandA = c(1, 0, 0, 1, 0, 1, NA, NA, NA, NA, NA, NA, NA, 1,
0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1),
BrandB = c(NA, NA, NA, NA, NA, NA, 1, 1, 0, 1, 0, 1, 1, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
BrandC = c(1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0,
1, 1, 1, 0, 1, 0, 1, 0, 1)
)
data %>%
tab_cells(mrset(as.category(BrandA %to% BrandC))) %>%
tab_cols(total(), Age) %>%
tab_stat_cpct() %>%
tab_last_sig_cpct() %>%
tab_pivot()
## | | #Total | Age | | |
## | | | 25-34 | 35-54 | 55+ |
## | | | A | B | C |
## | ------------ | ------ | ------- | ----- | ---- |
## | BrandA | 52.4 | 83.3 B | 28.6 | 50.0 |
## | BrandB | 23.8 | | 42.9 | 25.0 |
## | BrandC | 71.4 | 100.0 C | 71.4 | 50.0 |
## | #Total cases | 21 | 6 | 7 | 8 |
1 ответ
Считается, что все элементы в наборах множественных ответов имеют одну и ту же базу. База для mdset
количество случаев, в которых у нас есть хотя бы один непустой элемент (элемент со значением 1). Вот почему база для ваших брендов составляет 21. Если мы будем рассматривать каждый элемент отдельно, нам нужно показать итоговую сумму для каждого элемента, чтобы вычислить значимость. Во многих случаях это очень неудобно.
В вашей ситуации вы можете использовать следующую функцию:
library(expss)
tab_stat_dich = function(data, total_label = NULL, total_statistic = "u_cases",
label = NULL){
if (missing(total_label) && !is.null(data[["total_label"]])) {
total_label = data[["total_label"]]
}
if(is.null(total_label)){
total_label = "#Total"
}
# calculate means
res = eval.parent(
substitute(
tab_stat_mean_sd_n(data, weighted_valid_n = "w_cases" %in% total_statistic,
labels = c("|", "@@@@@", total_label),
label = label)
)
)
curr_tab = res[["result"]][[length(res[["result"]])]]
# drop standard deviation
curr_tab = curr_tab[c(TRUE, FALSE, TRUE), ]
# convert means to percent
curr_tab[c(TRUE, FALSE), -1] = curr_tab[c(TRUE, FALSE), -1] * 100
## clear row labels
curr_tab[[1]] = gsub("^(.+?)\\|(.+)$", "\\2", curr_tab[[1]], perl = TRUE )
res[["result"]][[length(res[["result"]])]] = curr_tab
res
}
set.seed(123)
data <- data.frame(
Age = sample(c("25-34", "35-54", "55+"), 25, replace = TRUE),
BrandA = c(1, 0, 0, 1, 0, 1, NA, NA, NA, NA, NA, NA, NA, 1,
0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1),
BrandB = c(NA, NA, NA, NA, NA, NA, 1, 1, 0, 1, 0, 1, 1, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
BrandC = c(1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0,
1, 1, 1, 0, 1, 0, 1, 0, 1)
)
res = data %>%
tab_cells(BrandA %to% BrandC) %>%
tab_cols(total(), Age) %>%
tab_stat_dich() %>%
tab_last_sig_cpct() %>%
tab_pivot()
res
# | | #Total | Age | | |
# | | | 25-34 | 35-54 | 55+ |
# | | | A | B | C |
# | ------ | ------ | ----- | ------ | ---- |
# | BrandA | 61.1 | 71.4 | 83.3 C | 20.0 |
# | #Total | 18 | 7 | 6 | 5 |
# | BrandB | 71.4 | 100.0 | 66.7 | 50.0 |
# | #Total | 7 | 2 | 3 | 2 |
# | BrandC | 60.0 | 55.6 | 66.7 | 57.1 |
# | #Total | 25 | 9 | 9 | 7 |
# if we want to drop totals
where(res, !grepl("#", row_labels))
# | | #Total | Age | | |
# | | | 25-34 | 35-54 | 55+ |
# | | | A | B | C |
# | ------ | ------ | ----- | ------ | ---- |
# | BrandA | 61.1 | 71.4 | 83.3 C | 20.0 |
# | BrandB | 71.4 | 100.0 | 66.7 | 50.0 |
# | BrandC | 60.0 | 55.6 | 66.7 | 57.1 |