我的心理学实验中有单词刺激的价类别。
1 = 负面,2 = 中性,3 = 正面
我需要用伪随机条件对数千个刺激进行排序。
Val_Category 连续不能有超过 2 个相同价态刺激,即连续不能超过 2x 个负刺激。
例如 - 2, 2, 2 = 不可接受
2,2,1=好的
我无法对数据进行排序,即决定整个实验将是 1,3,2,3,1,3,2,3,2,2,1,因为我不允许有模式。
我尝试了各种软件包,如 dylpr、sample、order、sort,但到目前为止还没有解决问题。
我认为有一千种方法可以做到这一点,但其中没有一种可能非常漂亮。我编写了一个负责排序的小函数。这有点 hacky,但它似乎对我的尝试有效。
为了解释我所做的,该函数的工作原理如下:
# some vector of valences
val <- rep(1:3,each=50)
pseudoRandomize <- function(x, n){
# take an initial sample
out <- sample(val)
# check if the sample is "bad" (containing sequences longer than n)
bad.seq <- any(rle(out)$lengths > n)
# length of the whole sample
l0 <- length(out)
while(bad.seq){
# get lengths of all subsequences
l1 <- rle(out)$lengths
# find the bad ones
ind <- l1 > n
# take the last value of each bad sequence, and...
for(i in cumsum(l1)[ind]){
# take it out of the original sample
tmp <- out[-i]
# pick new position at random
pos <- sample(2:(l0-2),1)
# put the value back into the sample at the new position
out <- c(tmp[1:(pos-1)],out[i],tmp[pos:(l0-1)])
}
# check if bad sequences (still) exist
# if TRUE, then 'while' continues; if FALSE, then it doesn't
bad.seq <- any(rle(out)$lengths > n)
}
# return the reordered sequence
out
}
示例:
该函数可以用于有或没有名称的向量。如果向量被命名,那么这些名称仍将出现在伪随机向量上。
# simple unnamed vector
val <- rep(1:3,each=5)
pseudoRandomize(val, 2)
# gives:
# [1] 1 3 2 1 2 3 3 2 1 2 1 3 3 1 2
# when names assigned to the vector
names(val) <- 1:length(val)
pseudoRandomize(val, 2)
# gives (first row shows the names):
# 1 13 9 7 3 11 15 8 10 5 12 14 6 4 2
# 1 3 2 2 1 3 3 2 2 1 3 3 2 1 1
此属性可用于随机化整个数据框。为了实现这一点,从数据框中取出“价”向量,并通过行索引 (
1:nrow(dat)
) 或行名称 (rownames(dat)
) 为其分配名称。
# reorder a data.frame using a named vector
dat <- data.frame(val=rep(1:3,each=5), stim=rep(letters[1:5],3))
val <- dat$val
names(val) <- 1:nrow(dat)
new.val <- pseudoRandomize(val, 2)
new.dat <- dat[as.integer(names(new.val)),]
# gives:
# val stim
# 5 1 e
# 2 1 b
# 9 2 d
# 6 2 a
# 3 1 c
# 15 3 e
# ...
我相信这个循环将适当地设置价类别。我将价类别称为“治疗”。
#Generate example data
s1 = data.frame(id=c(1:10),treat=NA)
#Setting the first two rows
s1[1,"treat"] <- sample(1:3,1)
s1[2,"treat"] <- sample(1:3,1)
#Looping through the remainder of the rows
for (i in 3:length(s1$id))
{
s1[i,"treat"] <- sample(1:3,1)
#Check if the treat value is equal to the previous two values.
if (s1[i,"treat"]==s1[i-1,"treat"] & s1[i-1,"treat"]==s1[i-2,"treat"])
#If so draw one of the values not equal to that value
{
a = 1:3
remove <- s1[i,"treat"]
a=a[!a==remove]
s1[i,"treat"] <- sample(a,1)
}
}
这个解决方案并不是特别优雅。可能有一种更快的方法可以通过对几列或其他内容进行排序来完成此任务。
人类心理学是一个广泛的研究领域,研究人类思想、行为、情感和认知的复杂性。它试图理解一个人的思维、感觉和行为的原因,并在一个人对自我和环境的感知的形成中发挥着重要作用。本文将带领读者踏上复杂的“人类心理学世界”的探索之旅,审视其各个方面、理论框架和实际应用。