Imagem criada por stories em Freepik

Corrigindo uma escala psicométrica com R em poucos minutos

Gabriel Rodrigues
Datapsico
Published in
8 min readAug 2, 2020

--

O R é uma ferramenta bem eficiente para realizar manipulações de bancos de dados. Dentro do R, o pacote dplyr é um ótimo recurso para se ter quando o objetivo é a transformação de bancos de dados.

O pacote dplyr possui várias funções interessantes que permitem:

  • Selecionar variáveis de maneira dinâmica e fácil.
  • Criar novas variáveis a partir de variáveis antigas.
  • Sumarizar vários valores em um só.
  • Filtrar e agrupar variáveis de interesse a partir de condições específicas.

Em suma, o dplyr é um pacote muito versátil e bastante útil para manipulação de dados em objetos data.frame — ou seja, bancos de dados.

Para maiores informações sobre o dplyr, consulte https://dplyr.tidyverse.org/

Nesse tutorial, vamos seguir o mesmo fluxograma visto na semana passada, na qual, corrigimos o banco de dados DASS 42 utilizando o Python (DASS42 é “Depression Anxiety Stress Scales Responses”, banco disponível publicamente no site Kaggle):

Processo de exploração de dados. Criado por Wickham & Grolemund (2017)

Faça com a gente! Para executar os procedimentos descritos abaixo, não é necessário ter o banco de dados baixado no seu computador. Basta ter o R baixado — e, de preferência, também o RStudio.

Para entender como instalar e utilizar o R, consulte a nossa primeira publicação aqui.

Lendo o banco de dados

Antes de tudo, vamos ler nosso banco de dados utilizando uma função que vem instalada junto ao R: read.csv

dass <- read.csv("https://raw.githubusercontent.com/GabrielReisR/R/master/estrutura%20de%20dados/dados/dass42.csv")

O R entende que, nesse link da web, existe um arquivo .csv, armazenando como um data.frame o conteúdo desse arquivo. O nome que escolhemos para o objeto data.frame foi dass.

Rodando View(dass) , o RStudio abre uma aba com o banco de dados:

Aba do RStudio com o banco de dados DASS42.

Lendo o pacote dplyr

Para começar a manipular esse banco de dados, vamos ler o pacote dplyr. Caso você ainda não tenha esse pacote, saiba que ele pode ser instalado junto ao pacote tidyverse, uma família de pacotes para R desenvolvida pelo pessoal do RStudio.

Para realizar a instalação, basta rodar o código abaixo.

install.packages("tidyverse")# se quiser todos pacotes do tidyverse
install.packages("dplyr") # para instalar apenas o dplyr

Para começar a usar o dplyr, vamos ler ele no R com library(dplyr)

Selecionando variáveis principais

No banco DASS42, as variáveis de resposta às perguntas de depressão, ansiedade e estresse são as respostas “Q1A, Q2A, Q3A,…, Q42A”.

Sendo assim, pelo menos nesse momento, não precisamos nos preocupar com as colunas “Q1I, Q1E, Q2I, Q2E,…Q42I, Q42E” ou com as colunas de variáveis sociodemográficas.

Vamos utilizar a função select para selecionar todas as variáveis que comecem com Q e terminem com A.

dass <- dass %>%
select(starts_with("Q") & ends_with("A"))

Note que utilizamos o operador “&”. Agora vamos renomear todas essas variáveis também usando o select().

dass <- dass %>%
select(dass_ = starts_with("Q"))

Entendendo melhor:

  • dass_ será o nome de todas as variáveis que comecem com “Q”.
  • dass_1 armazena o nome dessa primeira variável, Q1A.
  • dass_ reconhece outro valor que também começa com Q.
  • dass_2 é a solução para armazenar Q2A.
  • Esse processo se repete até dass_42.

Vamos olhar como estão os nomes das colunas usando names(dass)

Novos nomes das colunas.

Recalculando valores

Assim como apontado pelo Dalton na semana passada, a DASS é respondida de 0 a 3, e aqui temos resposta de 1 a 4. Isso é importante pois os pontos de corte para a classificação de severidade parte de escores brutos das respostas.

Assim, precisamos que

  • Todas as variáveis respondidas com 1 sejam 0.
  • Todas as variáveis respondidas com 2 sejam 1.
  • Todas as variáveis respondidas com 3 sejam 2.
  • Todas as variáveis respondidas com 4 sejam 3.

Caso o banco não tenha nenhum missing, como é o caso desse banco, podemos simplesmente pedir:

dass <- dass %>%
select(starts_with("dass")) %>%
- 1

Bem mais simples! Essa foi uma solução proposta pelo André Stephanou.

Resultado:

Calculando depressão, ansiedade e estresse

Lembra que mutate() consegue alterar o valor de apenas uma variável por vez? Vamos utilizar ele agora para pegar o valor de outras variáveis e criar três novas. Ou seja, vamos criar três novas colunas.

Cada participante, cada linha (ou row em inglês), terá os valores do nível de depressão, ansiedade e estresse calculados como abaixo.

  • Itens da Depressão: 2, 5, 12, 13, 16, 17, 20, 23, 25, 26, 31, 32, 36 e 41
  • Itens da Ansiedade: 1, 6, 8, 10, 11, 14, 21, 22, 27, 28, 34, 37, 40 e 42
  • Itens do Estresse: 3, 4, 7, 9, 15, 18, 19, 24, 29, 30, 33, 35 e 38

Para acessar o valor de cada linha para fazer esse cálculo — ou seja, para que a soma das colunas diga respeito a cada um dos participantes — vamos utilizar o verbo rowwise() antes de realizar o cálculo. Fica assim:

dass <- dass %>%
rowwise() %>% # para o cálculo ser realizado em cada linha
mutate(
# criando a variável 'depressao'
depressao = sum(dass_2, dass_5, dass_12, dass_13, dass_16, dass_17, dass_20, dass_23, dass_25, dass_26, dass_31, dass_32, dass_36, dass_41),

# criando a variável 'ansiedade'
ansiedade = sum(dass_1, dass_6, dass_8, dass_10, dass_11, dass_14, dass_21, dass_22, dass_27, dass_28, dass_34, dass_37, dass_40, dass_42),

# criando a variável 'estresse'
estresse = sum(dass_3, dass_4, dass_7, dass_9, dass_15, dass_18, dass_19, dass_24, dass_29, dass_30, dass_33, dass_35, dass_38, dass_39)
)

Perceba que basta utilizar a função sum() para somar os valores.

As novas colunas ficaram assim:

Novas colunas calculas com mutate()

Classificando o nível de severidade

Agora que temos os escores de cada pessoa na escala DASS42, vamos classificar esses escores por nível de gravidade/severidade.

Para isso, existe uma função bem útil que se chama case_when. Especificamos uma condição baseada em outra variável, e assim que essa condição é atendida, determinado valor é criado.

Vamos utilizá-la dentro de mutate() para criar nossas classificações.

dass <- dass %>%
mutate(
# classificação do nível de depressão
nivel_dep = case_when(depressao < 10 ~ "Normal",
depressao >= 10 & depressao < 14 ~ "Leve",
depressao >= 14 & depressao < 21 ~ "Moderado",
depressao >= 21 & depressao < 28 ~ "Severo",
depressao >= 28 ~ "Extremamente Severo"),
# classificação do nível de ansiedade nivel_ans = case_when(ansiedade < 8 ~ "Normal",
ansiedade >= 8 & ansiedade < 10 ~ "Leve",
ansiedade >= 10 & ansiedade < 15 ~ "Moderado",
ansiedade >= 15 & ansiedade < 20 ~ "Severo",
ansiedade >= 20 ~ "Extremamente Severo"),
# classificação do nível de estresse nivel_est = case_when(estresse < 15 ~ "Normal",
estresse >= 15 & estresse < 19 ~ "Leve",
estresse >= 19 & estresse < 25 ~ "Moderado",
estresse >= 25 & estresse < 34 ~ "Severo",
estresse >= 34 ~ "Extremamente Severo")
)

A função acima criou três novas colunas (nivel_dep/ans/est) baseando-se nos valores de suas respectivas colunas.

O que aconteceu foi o seguinte:

  • case_when() considera a primeira condição e atribui o valor que queremos a essa condição.
  • No primeiro caso, quando a variável depressao for menor que 10 atribui-se a essa nova coluna o valor “Normal”: depressao < 10 ~ "Normal"
  • Para fornecer as outras condições, basta colocar uma vírgula e continuar.

Para valores que fogem ao que a função consegue oferecer, poderia-se criar a condição TRUE ~ ., atribuindo um valor específico caso nenhuma outra condição satisfaça o que está send pedido.

O resultado foi o seguinte:

As três novas colunas calculadas.

Quantos casos são graves?

Possuindo os valores acima, podemos criar a seguinte classificação de uma caso grave: um participante que possui nível de depressão + ansiedade + estresse considerados como “Severo” ou “Extremamente Severo”.

Vamos ver quantos participantes (utilizando a função nrow()) preenchem esses critérios. Vamos adicionar esses casos ao novo banco de dados chamado casosGraves.

Vamos utilizar filter(), uma outra função do dplyr, para nos auxiliar com esse problema.

casosGraves <- dass %>%
filter(nivel_dep == "Severo" | nivel_dep == "Extremamente Severo",
nivel_ans == "Severo" | nivel_ans == "Extremamente Severo",
nivel_est == "Severo" | nivel_est == "Extremamente Severo")

nrow(casosGraves)
Fazendo View(casosGraves), vemos que apenas casos com nível de depressão, ansiedade e estresse Severos ou acima entraram no banco.

Dos 39775 participantes, 10431 apresentam sintomas de Depressão + Ansiedade + Estresse acima do nível Severo!

Ou seja, 26,22% da amostra preencheram nosso critério de gravidade. Aqui, tenho a hipótese de que esse número seja alto por conta de um viés amostral presente no momento da coleta de dados. Explico melhor.

Os dados foram coletados das pessoas que entraram na plataforma OpenPsychometrics.org e resolveram responder à pesquisa sobre depressão, ansiedade e estresse.

É possível que o público que busca e que é interessado em responder a testes de ansiedade e depressão na internet seja formado por pessoas com maiores níveis dessas variáveis.

Histogramas, scatterplot e correlações de Spearman

Outra análise que dá pra fazer com o banco da DASS42 é entender:

  • a distribuição de respostas de cada variável (depressão, ansiedade e estresse; histogramas)
  • como elas se relacionam entre si (scatterplot)
  • e as correlações que elas têm entre si (correlações).

Vamos criar um banco apenas com os resultados da DASS42:

dass_escores <- dass %>% 
select(depressao, ansiedade, estresse)

Um pacote que auxilia bastante na questão da plotagem de histogramas + correlação é o pacote psych (que coincidentemente acabou de receber uma atualização no dia 26 de Julho).

Basta ler o pacote psych e utilizar a função pairs.panels , o título da figura fica por conta do argumento main = "Histogramas, scatterplots e correlações" e a correlação utilizada foi a de Spearman.

library(psych) # caso não tenha, instale: install.packages(“psych”)pairs.panels(x = dass_escores, # banco usado
ellipses = FALSE, # retirar elipses
method = "spearman", # correlação de spearman
hist.col = "orange",
main = "Histogramas, scatterplots e correlações")

Em hist.col = 'orange', escolhi a cor do histograma como laranja, porque eu gosto de laranja :p

O resultado é essa figura completinha que nos informa tanto sobre a distribuição de respostas quanto nos dá a dimensão da alta correlação entre as três variáveis!

Outra coisa legal de ver são as linhas de regressão nos scatterplots entre as variáveis. E tudo isso com algumas linhas de código.

Espero que tenha gostado! O objetivo foi ensinar um pouco sobre o poderoso dplyr e suas aplicações importantes na correção de escalas psicométricas. Uma explicação mais completa sobre o dplyr pode ser vista aqui.

Como procurar ajuda?

Contato

Espero que tenha gostado! Qualquer dúvida, observação ou comentário são muito bem-vindos! Fique à vontade para se manifestar e vamos aprender juntos 😄

Para falar comigo, é só entrar em qualquer um desses links.

☕️ Gostou do post e vai usar algo? Se quiser, você pode me pagar um café.

--

--

Gabriel Rodrigues
Datapsico

Sou um psicólogo que trabalha com Análise e Ciência de Dados desde a graduação — busco criar e compartilhar conteúdo sobre esses assuntos. linktr.ee/gabrielrr