排名基于一些条件
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:"))
我希望形成一个依赖于配对的排名。所以说我有一个矩阵
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:"))