繁体   English   中英

手动和for循环即使使用set.seed也返回不同的值

[英]Manual and for loop return different values even with set.seed

我试图自动找到功能的总和。 然后,为确保它按预期运行,我手动进行了处理并使用for循环,但是结果不同。 这是我的代码(我的功能比本示例要难得多,但是相似)

mu1 <- list(2,3,4)
sd1 <- list(0.5,0.6,0.7)
w <- c(0.5,0.2,0.3)
set.seed(123)
mylist <- list(rnorm(10,mu1[[1]],sd1[[1]]),
rnorm(10,mu1[[2]],sd[[2]]),
rnorm(10,mu1[[3]],sd[[3]]))
ta <- list(c(0.5,0.6,0.7,0.4,0.3,0.5,0.65,0.2,0.9,0.1),c(0.4,0.6,0.7,0.2,0.3,0.5,0.65,0.2,0.8,0.3),
           c(0.3,0.2,0.7,0.4,0.3,0.5,0.25,0.2,0.6,0.4))
xx <- sum(ta[[1]]*(log(w[1])+dnorm(mylist[[1]],log=T)),ta[[2]]*(log(w[2])+dnorm(mylist[[2]],log = T)),ta[[3]]*
      (log(w[3])+dnorm(mylist[[3]],log = T)))

ll <- list()
for(i in 1:3){
 ll[[i]] <-  ta[[i]]*log(w[i])+dnorm(mylist[[i]],log = T)
 sum(ll[[i]])
}

手动和循环分别返回这些结果,

[1] -89.6547
[1] -84.28907

为什么这些结果不平等。 请提供任何帮助,仍然是因为set.seed

大括号的执行顺序可能有问题。 在第一种情况下,由于运算符优先级,首先发生ta[[3]]*log(w[[3]] ,然后将输出添加到dnorm(my[[3]], log = TRUE)

sum(ta[[3]]*log(w[3]) + dnorm(mylist[[3]], log = TRUE))
#[1] -84.28907

而在下面,我们将ta[[3]]与( log(w[3]) + dnrom(mylist[[3]], log = TRUE) )之和log(w[3]) + dnrom(mylist[[3]], log = TRUE)括号内的值。

sum(ta[[3]]*(log(w[3]) + dnorm(mylist[[3]], log = TRUE)))
#[1] -33.48956

在第二个中,括号从(log(w[3]...)


仅检查一下,我们正在使用mapply ,它给出的输出为-89.6547 ,这是所有三种手动情况的总和。

sum(mapply(function(x, y, z) sum(x*(y +dnorm(z, log = TRUE))), ta, log(w), mylist))
#[1] -89.6547

另外,如果我们纠正for循环中的花括号,则输出将相同

ll <- list()
 for(i in 1:3){
  ll[[i]] <-  sum(ta[[i]]*(log(w[i])+dnorm(mylist[[i]],log = T)))

 }
sum(unlist(ll))
#[1] -89.6547

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM