尝试在 R 中创建和使用随机排列测试函数时出错
Errors when trying to create and use a random permutation test function in R
我试图在 RStudio 中完成随机排列测试,但不断出现以下两个错误:
错误:评估嵌套太深:无限递归/选项(表达式=)?
总结期间出错:评估嵌套太深:无限递归/选项(表达式=)?
#create groups/data vectors
drinks = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
mosquito = c(27, 20, 21, 26, 27, 3, 24, 21, 20, 19, 23, 24, 28, 19, 24, 29, 18, 20, 17, 31, 20, 25, 28, 21, 27, 21, 22, 15, 12, 21, 19, 15, 22, 24, 19, 23, 13, 22, 20, 24, 18, 20)
#create function
rpermut = function(group, outcome, permutation){
diff = rep(NA, permutation)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])}
diff
}
#adding values to function
mosrep = rpermut(group=drinks, outcome=mosquito, permutation=1000)
我不确定错误代码是什么意思,也不知道如何解决问题以便该函数 运行。如果您能就我这里出错的地方提供任何帮助,我将不胜感激!
所以它似乎对我有一些改变。
首先,我假设饮料和蚊子的长度应该相同,但在您的问题中并非如此。
> length(drinks)
[1] 43
> length(mosquito)
[1] 42
其次,levels() 作用于因子,而饮料和蚊子这些对象是数字向量。
> class(drinks)
[1] "numeric"
> class(mosquito)
[1] "numeric"
因此,为了让这个功能在我的机器上运行,我不得不将功能调整为:
rpermut = function(group, outcome, permutation){
diff = c()
group = as.factor(group)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])
}
return(diff)
}
这只是将组更改为具有 as.factor()
的因子
我还将 diff = rep(NA, permutation)
更改为 diff = c()
,这会创建一个空向量。无需将 NA 分配给所有值,因为您可以用相同的方式简单地用 diff[i]
填充一个条目。
所以向量需要相同的长度,然后这应该可以工作,也可以简单地添加一个检查。
if(length(group) != length(outcome)){
stop("input vector lengths does not match!")
}
总计:
rpermut = function(group, outcome, permutation){
if(length(group) != length(outcome)){
stop("input vector lengths does not match!")
}
diff = c()
group = as.factor(group)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])
}
return(diff)
}
我试图在 RStudio 中完成随机排列测试,但不断出现以下两个错误: 错误:评估嵌套太深:无限递归/选项(表达式=)? 总结期间出错:评估嵌套太深:无限递归/选项(表达式=)?
#create groups/data vectors
drinks = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
mosquito = c(27, 20, 21, 26, 27, 3, 24, 21, 20, 19, 23, 24, 28, 19, 24, 29, 18, 20, 17, 31, 20, 25, 28, 21, 27, 21, 22, 15, 12, 21, 19, 15, 22, 24, 19, 23, 13, 22, 20, 24, 18, 20)
#create function
rpermut = function(group, outcome, permutation){
diff = rep(NA, permutation)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])}
diff
}
#adding values to function
mosrep = rpermut(group=drinks, outcome=mosquito, permutation=1000)
我不确定错误代码是什么意思,也不知道如何解决问题以便该函数 运行。如果您能就我这里出错的地方提供任何帮助,我将不胜感激!
所以它似乎对我有一些改变。 首先,我假设饮料和蚊子的长度应该相同,但在您的问题中并非如此。
> length(drinks)
[1] 43
> length(mosquito)
[1] 42
其次,levels() 作用于因子,而饮料和蚊子这些对象是数字向量。
> class(drinks)
[1] "numeric"
> class(mosquito)
[1] "numeric"
因此,为了让这个功能在我的机器上运行,我不得不将功能调整为:
rpermut = function(group, outcome, permutation){
diff = c()
group = as.factor(group)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])
}
return(diff)
}
这只是将组更改为具有 as.factor()
我还将 diff = rep(NA, permutation)
更改为 diff = c()
,这会创建一个空向量。无需将 NA 分配给所有值,因为您可以用相同的方式简单地用 diff[i]
填充一个条目。
所以向量需要相同的长度,然后这应该可以工作,也可以简单地添加一个检查。
if(length(group) != length(outcome)){
stop("input vector lengths does not match!")
}
总计:
rpermut = function(group, outcome, permutation){
if(length(group) != length(outcome)){
stop("input vector lengths does not match!")
}
diff = c()
group = as.factor(group)
for(i in 1:permutation){
outcome = sample(outcome)
diff[i] = mean(outcome[group==levels(group)[1]]) - mean(outcome[group==levels(group)[2]])
}
return(diff)
}