Лесен начин за почистване на данните от въпросника и измерванията

Ако използвате R за анализ на данни, има вероятност да попаднете в ситуация, в която работите с интервални данни. Често е полезно да можете да обръщате данните в интервална скала. Ето как да го направите с примери стъпка по стъпка. Ако искате целият код, включен в тази статия, в един скрипт, вижте същността на GitHub в края.

Работа с данни от проучване

Представете си, че сте психолог, който е събрал данни за тревожните преживявания на хората. Дадохте на хората анкети, питайки ги колко тревожни се чувстват в момента, колко често изпитват тревожни мисли ежедневно и т.н. Искате да анализирате тези данни, за да дадете оценка на всеки от вашите участници за тяхното безпокойство. Но въпросникът, който използвахте, имаше няколко въпроса с обратна формулировка, където обичайната скала за отговори се прилага обратно. Трябва да обърнете кодирането на тези отговори, за да получите точните резултати, когато сумирате отговорите за всеки участник.

За щастие, има лесен начин за извършване на този вид анализ в R. За да демонстрираме, нека създадем някои данни за този пример.

Да приемем, че всеки елемент от нашата анкета използва 7-степенна скала на Likert, като тази:

„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. Това също ми помага пряко, тъй като получавам малка вноска от вашия членски внос без допълнителни разходи за вас.

Можете също така да получавате всички мои нови статии направо във входящата ви кутия, когато публикувам, като се абонирате тук. Благодаря за четенето!