Найдите несколько «точек переключения», сравнивая ответы в столбцах - PullRequest
2 голосов
/ 10 июля 2020

У меня есть набор данных, в котором испытуемые делали выбор между А и Б для 13 различных Б. Ниже приведен упрощенный пример того, как выглядят данные с 54 предметами и 5 вариантами. (1 - A, 2 - B).

      subject choice1 choice2 choice3 choice4 choice5
1       1       1       1       1       2       2       
2       2       1       1       2       2       2       
3       3       1       2       1       2       2       
4       4       1       2       2       2       2       

Я хотел бы найти вопросы, в которых испытуемые переключают вариант A на B, то есть для предмета 1 это будет выбор4.

В предыдущем исследовании мы сделали это, подсчитав, сколько раз испытуемый выбрал вариант А, а затем выбрав соответствующий вариант Б, сформировав отдельную матрицу. См. Код ниже.

Однако теперь разница в том, что вместо выбора одной точки переключения испытуемым задавались вопросы в случайном порядке, и, таким образом, существует возможность иметь несколько точек переключения. Например, в приведенной выше таблице субъект 3 переключается на B по выбору 2 и снова по выбору 4.

Я хотел бы найти как первый раз, когда субъект переключается на вариант B, так и последний раз (перед тем, как придерживаться B для остальных вариантов).

sure_amounts <- matrix(nrow = 4, ncol = 13) # 4 treatments, 13 questions
sure_amounts[1, ] <- c(0, 2, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 8, 10)  # Option B's
sure_amounts[2, ] <- seq(2, 14, 1)
sure_amounts[3, ] <- seq(2, 14, 1)  
sure_amounts[4, ] <- seq(2, 14, 1)

b_choice <- matrix(nrow = 201, ncol = 4)
switch_choice <- matrix(nrow = 201, ncol = 4) # switching point form A to B

for(j in 1:4){    # number of treatments
  for(i in 201){   # number of subjects
    choice = NULL
    fl = data$ID == i
    k = 1 + 36*(j-1)      # 36 before going to the next treatment (due to other questions)
    
    choice = c(data[fl,k:(k+12)])
    b_choice[i,j] = length(choice[choice==1])  
    temp = b_choice[i,j]
    switch_choice[i,j] <- ifelse(temp==0, 0, sure_amounts[j, temp])
  }
}

Есть ли у кого-нибудь советы, как к этому подойти? Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

A Base R решение:

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

Код:

lapply(as.data.frame(t(df_1)[-1,]), function(x){
  t <- x - c(x[-1], 0) # row substracted by shortened row
  z <- which(t[-length(t)] != 0) # values not equal to zero and rm last value 
  z + 1 # remove lag
})

# $`1`
# [1] 4

# $`2`
# [1] 3

# $`3`
# [1] 2 3 4

# $`4`
# [1] 2

Данные:

df_1 <- read.table(text = "      subject choice1 choice2 choice3 choice4 choice5
1       1       1       1       1       2       2       
2       2       1       1       2       2       2       
3       3       1       2       1       2       2       
4       4       1       2       2       2       2 ", header = T)
2 голосов
/ 10 июля 2020

Я не уверен, как вы хотите, чтобы ваш ожидаемый результат выглядел, но вы можете попытаться получить данные в длинном формате и для каждой subject выбрать строки, в которых они переключаются с 1 на 2.

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = -subject) %>%
  group_by(subject) %>%
  filter(value == 2 & lag(value) == 1 | 
         value == 1 & lead(value) == 2)

#    subject name    value
#     <int> <chr>   <int>
# 1       1 choice3     1
# 2       1 choice4     2
# 3       2 choice2     1
# 4       2 choice3     2
# 5       3 choice1     1
# 6       3 choice2     2
# 7       3 choice3     1
# 8       3 choice4     2
# 9       4 choice1     1
#10       4 choice2     2

Здесь мы видим, что субъект 1 перемещается из 1 -> 2 от выбора 3 -> выбора 4 и т. Д.

данные

df <- structure(list(subject = 1:4, choice1 = c(1L, 1L, 1L, 1L), choice2 = c(1L, 
1L, 2L, 2L), choice3 = c(1L, 2L, 1L, 2L), choice4 = c(2L, 2L, 
2L, 2L), choice5 = c(2L, 2L, 2L, 2L)), class = "data.frame", 
row.names = c(NA, -4L))
0 голосов
/ 10 июля 2020

Альтернативный подход:




library(dplyr)
library(stringr)
library(purrr)


  df %>%
  mutate(g = paste0(choice1, choice2, choice3, choice4, choice5),
         switches = as.character(map(g, ~pluck(str_locate_all(.x, "12"), 1)))) %>% 
  select(-g)
#>   subject choice1 choice2 choice3 choice4 choice5      switches
#> 1       1       1       1       1       2       2           3:4
#> 2       2       1       1       2       2       2           2:3
#> 3       3       1       2       1       2       2 c(1, 3, 2, 4)
#> 4       4       1       2       2       2       2           1:2

данные

df <- structure(list(subject = 1:4, choice1 = c(1L, 1L, 1L, 1L), choice2 = c(1L, 
                                                                             1L, 2L, 2L), choice3 = c(1L, 2L, 1L, 2L), choice4 = c(2L, 2L, 
                                                                                                                                   2L, 2L), choice5 = c(2L, 2L, 2L, 2L)), class = "data.frame", row.names = c("1", 
                                                                                                                                                                                                              "2", "3", "4"))

Создано 10.07.2020 с помощью пакета (v0.3.0 )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...