排名基于一些条件

Ranking Based on a number of conditions

我希望形成一个依赖于配对的排名。所以说我有一个矩阵

    subject stim1 stim2 Chosen Tchosen
 1:       1    34    35     34      32
 2:       1    34    36     34      25
 3:       1    34    36     36       6
 4:       1    35    37     35      19
 5:       1    35    37     37      13
 6:       1    36    38     36       9
 7:       1    36    38     38      22
 8:       1    37    39     37      29
 9:       1    37    39     39       2
10:       1    38    39     38      25
11:       1    38    39     39       6

我的 objective 是让每个受试者根据 Tchosen 对每个刺激进行排名,排名为 1,2 或 3。问题是它的排名仅相对于其他两个选项(即只有 stim1 stim2 配对与排名相关)。

例如,对于 stim1=34,它被选择的次数多于 35 或 36(对于 stim1=34 stim2=35,Chosen=34 的 Tchosen 高于 Chosen=36 的 TChosen),因此应该排名 1.

另外,我看一下 36。36 与 34 和 38 配对。它的选择频率低于 34,也低于 38,因此排名为 3。

另外我看一下stim1=37。 37 与 35 和 39 配对。37 的选择频率低于 35 但高于 39,因此排名为 2

期望的输出

subject stim Rank 
1        34   1
1        35   2
1        36   3
1        37   2
1        38   1
1        39   3  

这是一个想法。
主要思想是,更少的损失(损失=选择了另一个刺激)意味着更高的排名。因此,总是选择的刺激物获得排名第一,从未选择的刺激物获得最后的排名。因此我创建了一个列 diff,表明谁被选中的次数更多。正差异意味着 stim1 被更频繁地选择,负差异意味着 stim2 被更频繁地选择。然后我总结了某个刺激物丢失的时间(没有选择另一个刺激物)。最后,损失为 0 的刺激(刺激总是被选择)获得排名 1,并且对于每一次损失,刺激排名下降一级。

代码

df %>% 
  #transform table 
  # subjecct - stim1 - stim2 - votes for stim1 (Tc1) -
  # votes for stim2 (Tc2)
  group_by(subject, stim1, stim2) %>%
  mutate(id = ifelse(stim1 == Chosen, 1, 2)) %>%
  ungroup() %>%
  pivot_wider(id_cols = -c(Tchosen, id, Chosen ),
              names_from = id, 
              names_prefix = "Tc",
              values_from = c(Tchosen),
              values_fill = 0) %>%
  #how many votes got stim1 over stim2 
  #(positive diff - stim1 got more votes, 
  #negative ifff - stim2 go more votes)
  mutate(diff = Tc1- Tc2) %>%
  # transformed stims into long format
  pivot_longer(cols = c(stim1, stim2),
               values_to = "stim") %>% 
  group_by(subject, stim) %>%
  # how often was another stim chosen
  summarise(loss = sum(name == "stim1" & diff < 0 |  
                        name  == "stim2" & diff > 0 )
            )%>%
  # rank losses (less losses - higher rank)
  mutate(rank = loss + 1)  %>%
  select(-loss)

输出

 A tibble: 6 x 3
# Groups:   subject [1]
  subject  stim  rank
    <int> <int> <dbl>
1       1    34     1
2       1    35     2
3       1    36     3
4       1    37     2
5       1    38     1
6       1    39     3

数据

df <- structure(list(subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), stim1 = c(34L, 34L, 34L, 35L, 35L, 36L, 36L, 37L, 37L, 
38L, 38L), stim2 = c(35L, 36L, 36L, 37L, 37L, 38L, 38L, 39L, 
39L, 39L, 39L), Chosen = c(34L, 34L, 36L, 35L, 37L, 36L, 38L, 
37L, 39L, 38L, 39L), Tchosen = c(32L, 25L, 6L, 19L, 13L, 9L, 
22L, 29L, 2L, 25L, 6L)), class = "data.frame", row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:", "7:", "8:", "9:", "10:", "11:"))