R 使用嵌套列表的嵌套循环

R 使用嵌套列表的嵌套循环,r,nested-loops,R,Nested Loops,我尝试使用嵌套列表和嵌套循环将值与阈值进行比较。该列表包含一个个体列表,每个个体获得n试验次数,其中(在每个试验中)他们从两个分布中获得两个值。然后使用Kullback-Leibler散度(KLD)组合这些值,这意味着每个试验现在只有一个值。目标是找出(每个人)这些值中有多少等于或超过阈值 问题是结果不符合逻辑。当阈值为0.5时(根据我的计算),我应该得到很多1(在我的compare_05)。对我做错了什么有什么建议吗?我对编码非常陌生,所以代码可能看起来有点粗糙 n = 10#trials x

我尝试使用嵌套列表和嵌套循环将值与阈值进行比较。该列表包含一个个体列表,每个个体获得
n
试验次数,其中(在每个试验中)他们从两个分布中获得两个值。然后使用Kullback-Leibler散度(KLD)组合这些值,这意味着每个试验现在只有一个值。目标是找出(每个人)这些值中有多少等于或超过阈值

问题是结果不符合逻辑。当阈值为
0.5时(根据我的计算),我应该得到很多1(在我的
compare_05
)。对我做错了什么有什么建议吗?我对编码非常陌生,所以代码可能看起来有点粗糙

n = 10#trials
x = 5#people

p_sd = 1
s_sd = 0.5
KL_sd = 0.4472136

rand_values = list(1:2)
trials = list(rep(rand_values,n))
all_1 = rep(trials, x) #nested lists

for (i in 1:x){
  for (k in 1:n){
    for (m in 1:2){
      if (all_1[[i]][[k]][[m]]==1){
        all_1[[i]][[k]][[m]]=rnorm(1,0,2) #adding the random values
      } else {
        all_1[[i]][[k]][[m]]=rnorm(1,0,1)
      }
    }
  }
}

compare_05=numeric(x)
for (i in 1:x){
  for (k in 1:n){
    compare_05[i]=length(which(   #the next seven lines make up the KLD equation
      (log(p_sd/KL_sd) + (((KL_sd*KL_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                     (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
           (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*p_sd*p_sd))-0.5 
   +  
      log(KL_sd/p_sd) + (((p_sd*p_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
       (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*KL_sd*KL_sd))-0.5)
      >=0.5))/n 
  }
}
当我使用科恩的d而不是KLD组合随机抽取的值时,我完成了这项工作

all_2 = all_1
for (i in 1:x){
  for (k in 1:n){
    all_2[[i]][k]=sum(all_2[[i]][[k]][[1]]-all_2[[i]][[k]][[2]])
    all_2[[i]][k]=abs(all_2[[i]][[k]][[1]]/0.7905)
  }
}

compare_d_05 = numeric(x)
for (i in 1:x){
  compare_d_05[i]=length(which((as.numeric(all_2[[i]]))>=0.5))/n
}
cohen's d的结果(
compare\u d\u 05
):


我不希望输出与这些数字相似(除非你将阈值增加到2.5或2.75),但我绝对不应该得到很多
0.1
(或者
0.01
,如果你将
n
增加到100)。

当你定义
compare\u 05[I]
,它会被重新定义为每个
k
,所以你实际上是在做下面的事情

compare_05=numeric(x)
for (i in 1:x){
  for (k in n){#Only where k is n, not for other values of k
    compare_05[i]=length(which(   #the next seven lines make up the KLD equation
      (log(p_sd/KL_sd) + (((KL_sd*KL_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                     (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
           (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*p_sd*p_sd))-0.5 
   +  
      log(KL_sd/p_sd) + (((p_sd*p_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
       (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*KL_sd*KL_sd))-0.5)
      >=0.5))/n 
  }
}
这不会发生在cohen的d中,因为您在那里只使用了一个循环。如果我理解正确,您需要的是以下内容:

kld<-function(k, i, all_1){
  length(
    which(
      (log(p_sd/KL_sd)+(((KL_sd*KL_sd)+(all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                                                                (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
                                                                (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*p_sd*p_sd))-0.5 
       +  
         log(KL_sd/p_sd) + (((p_sd*p_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                                                                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
                                                                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*KL_sd*KL_sd))-0.5
    )>=0.5))/n
}

compare_05=numeric(x)
for(i in 1:x){
  compare_05[i]<-sum(unlist(lapply(1:10, kld, i, all_1)))
}
kld=0.5))/n
}
比较_05=数值(x)
对于(1:x中的i){

比较_05[i]@Rebekkasl太好了!在这种情况下,请单击我答案旁边的复选标记,这样问题将显示为“已关闭”
kld<-function(k, i, all_1){
  length(
    which(
      (log(p_sd/KL_sd)+(((KL_sd*KL_sd)+(all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                                                                (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
                                                                (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*p_sd*p_sd))-0.5 
       +  
         log(KL_sd/p_sd) + (((p_sd*p_sd) + (all_1[[i]][[k]][[1]]-((s_sd*s_sd)/
                                                                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[1]] + (p_sd*p_sd)/
                                                                    (s_sd*s_sd+p_sd*p_sd)*all_1[[i]][[k]][[2]]))^2)/(2*KL_sd*KL_sd))-0.5
    )>=0.5))/n
}

compare_05=numeric(x)
for(i in 1:x){
  compare_05[i]<-sum(unlist(lapply(1:10, kld, i, all_1)))
}
compare_05<-unlist(lapply(1:x, function(a, b, all_1)
  sum(unlist(lapply(1:b, kld, a, all_1))), n, all_1))