Вопросы множественного выбора в 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")
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