неточные проценты в таблице expss - PullRequest
0 голосов
/ 06 сентября 2018

Я анализирую некоторые данные опроса и использую 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 Ответ

0 голосов
/ 07 сентября 2018

Считается, что все элементы в наборах множественных ответов имеют одинаковую базу. База для 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 |
...