Вопросы множественного выбора в R

Социологические и маркетинговые опросы часто содержат вопросы множественного выбора (они же вопросы с совместимыми альтернативами). В R есть несколько пакетов, позволяющих анализировать взаимосвязи таких переменных (например, MRCV), однако отсутствуют функции для построения их одномерных распределений. В нижеприведенной программе я показываю, как можно задать переменную множественного выбора, состоящую из пяти дихотомий, и получить таблицу распределения с процентами по отношению к разным базам:

library(haven)

filename <- "http://sociology.in.ua/examples/multvar.sav"
x <- read_sav(filename, user_na = FALSE)

attr(x, "multiple.response.sets") <- list(
  V1 = list(
    variables = sprintf("V1_%d", 1:5),
    variable_coding = "dichotomies",
    counted_value = 1,
    label = "Какие из проблем Вас заботят больше всего?"
  )
)

mrtable <- function(data, set_name, weight = rep(1, dim(data)[1]),
  counts = TRUE, validn_pct = TRUE, totaln_pct = TRUE,
  responses_pct = TRUE)
{
  set <- attr(data, "multiple.response.sets")[[set_name]]
  data <- data[set$variables]
  tab <- sapply(data, function(v) xtabs(weight ~ v == set$counted_value))
  u <- sum(weight * apply(data, 1, function(s) set$counted_value %in% s))
  result <- list()
  if (counts) result[["частота"]] <- tab[2,]
  if (validn_pct) result[["% к ответившим"]] <- 100*tab[2,]/u ## sum(u*weight)
  if (totaln_pct) result[["% к опрошенным"]] <- 100*tab[2,]/sum(weight)
  if (responses_pct) result[["% к ответам"]] <- 100*tab[2,]/sum(tab[2,])
  if (length(result)) {
    result <- do.call("cbind", result)
    row.names(result) <- sapply(data, attr, "label")
    names(dimnames(result)) <- c("варианты", set$label)
  }
  return(result)
}





mrtable(x, "V1", weight = x$W, validn_pct = FALSE, responses_pct = FALSE)
mrtable(x, "V1")

Comments

Popular posts from this blog

метод категориальной сортировки в R

сохранение названий размерностей

Преподаватель как родитель