Простой способ очистить анкету и данные измерений

Если вы используете R для анализа данных, скорее всего, вы можете столкнуться с ситуацией, когда вы работаете с интервальными данными. Часто полезно иметь возможность инвертировать данные на шкале интервалов. Вот как это сделать, с пошаговыми примерами. Если вы хотите, чтобы весь код, показанный в этой статье, был в одном скрипте, ознакомьтесь с сутью GitHub в конце.

Работа с данными опроса

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

К счастью, в R есть простой способ проведения такого анализа. Чтобы продемонстрировать, давайте создадим некоторые данные для этого примера.

Допустим, каждый пункт нашего опроса использует 7-балльную шкалу Лайкерта, например:

«1 = Категорически не согласен; 2 = Не согласен; 3 = Скорее не согласен; 4 = ни согласен, ни не согласен; 5 = частично согласен; 6 = согласен; 7 = Полностью согласен»

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

library(tidyverse)

# Generate some simple data
survey_data <- tibble(
  participant = 1:7,
  worried_thoughts = sample(myscale, 7),
  anxiety_effects = sample(myscale, 7)
)

Первый столбец этого набора данных, worried_thoughts, содержит ответы участников на утверждение «У меня часто возникают навязчивые тревожные мысли». Второй столбец, anxiety_effects, содержит ответы на утверждение «Тревога редко влияет на мою повседневную жизнь».

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

К счастью, для этого есть простая формула.

Как обратить значения на шкале интервалов

Чтобы инвертировать значения на шкале интервалов, вы берете минимальное значение шкалы, на которой находится ваша переменная, вычитаете значение, которое вы инвертируете, а затем добавляете максимальное значение из вашей шкалы.

Эта формула работает со шкалой ответов, которая начинается с любого числа, положительного или отрицательного. Он также работает со шкалами с любым интервалом размера, если этот интервал непротиворечив.

Вот пример нескольких способов применения этой формулы для обращения значений числового интервала в наборе данных.

myscale <- 1:7

# The tidyverse way
survey_data <- survey_data %>%
  mutate(anxiety_effects_reversed = min(myscale) - anxiety_effects + max(myscale))

# The base R way
survey_data$anxiety_effects_reversed <- min(myscale) - survey_data$anxiety_effects + max(myscale)

В этом коде мы сначала определяем числовую шкалу, используемую в вопросе. Это просто вектор чисел от 1 до 7, хранящийся в переменной myscale.

Затем мы можем использовать значения в myscale в нашей формуле обратного кодирования. В примере с tidyverse эта формула выражается как min(myscale) — response + max(myscale), где response — это значение из столбца, который вы хотите перекодировать.

Это очень просто, и вы можете применить его с помощью Base-R или Tidyverse, как показано на рисунке. В обоих примерах результаты операции обратного кодирования сохраняются в новом столбце response_reversed.

Инверсия нескольких переменных шкалы интервалов

Как насчет ситуаций, когда вам нужно перевернуть шкалу нескольких вопросов в вашем наборе данных? Вы можете сделать это с помощью той же формулы, что и раньше, с небольшим добавлением магии tidyverse.

Для этого примера давайте создадим еще несколько примеров данных, на этот раз с несколькими вопросами.

# Generate more data
full_survey_data <- tibble(
  question = unlist(map(1:5, ~ rep(paste0("Question", .), 5))),
  participant = rep(1:5, 5),
  response = sample(myscale, 25, replace = T)
)

Эти данные имеют длинный формат, то есть в первом столбце повторяются несколько строк. Вы можете прочитать больше о разнице между длинными и широкими данными здесь, если вам интересно. Если данные вашей анкеты не в длинном формате, вы можете преобразовать их с помощью функции pivot_longer в R.

Чтобы перекодировать некоторые вопросы в этом наборе данных, оставив другие без изменений, нам сначала нужно выбрать вопросы, которые мы хотели бы перекодировать. Мы можем сделать это, создав вектор, содержащий названия вопросов, которые мы перекодируем. В этом случае мы хотим поменять местами оценки вопросов 2 и 3.

# Define vector of question names that you want to reverse
reverse_questions <- c("Question2", "Question3")

Теперь мы можем использовать этот вектор для выборочного применения нашей операции перекодирования. Мы можем сделать это, используя case_when в mutate, одной из моих любимых функций tidyverse.

full_survey_reversed <- full_survey_data %>%
  mutate(response = case_when(question %in% reverse_questions ~ min(myscale) - response + max(myscale),
                              TRUE ~ as.integer(response)))

Сначала это может быть много для обработки, поэтому давайте немного разберем это.

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

Затем функция case_when меняет местами значения в столбце ответов, но только для вопросов, которые мы хотим перекодировать. Он работает, проверяя каждую строку данных на соответствие условию. Здесь он проверяет, находится ли значение столбца вопроса в векторе имен вопросов, который мы определили ранее.

Если это так, он применяет формулу реверсирования шкалы к значению в столбце ответа. Вы можете увидеть это после символа тильды (~) в строке case_when. Если данная строка не содержит вопроса, который мы выбрали для перекодирования, case_when возвращает исходное значение столбца ответа без изменений. Это делается с помощью команды TRUE ~ as.integer(response).

Результатом этого кода является то, что значения в response меняются местами для вопросов, которые мы выбрали, и не изменяются для тех, которые мы не выбрали.

Оценка анкеты теперь проста. Опять же, мы используем функции tidyverse, на этот раз для суммирования ответов, чтобы получить баллы для каждого участника.

# Sum up each participant's survey score
full_survey_reversed %>%
  group_by(participant) %>%
  summarise(total_score = sum(response))

Поздравляем! Теперь вы можете легко изменить шкалу интервалов в R. Весь код, использованный в этой статье, см. ниже.

Удачной очистки данных!

Хотите прочитать все мои статьи о программировании на R, науке о данных и многом другом? Подпишитесь на членство в Medium по этой ссылке и получите полный доступ ко всем моим статьям и любой другой истории на Medium. Это также помогает мне напрямую, так как я получаю небольшой вклад от вашего членского взноса без каких-либо дополнительных затрат для вас.

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