2017-10-29 19 views
1

我試圖自動找到函數的總和。然後,爲確保它按預期運行,我手動執行並使用for循環,但結果不同。這裏是我的代碼(我的功能比這個例子中很困難,但都差不多)手動和循環返回不同的值,即使set.seed

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

+0

我想獲得相同的值,你的'for'循環'mapply(函數(X, y,z)sum(x * y + dnorm(z,log = TRUE)),ta,log(w),mylist) #[1] -34.32778 -67.25251 -84.28907'也使用手動方法' ta [[3]] * log(w [3])+ dnorm(mylist [[3]],log = TRUE)) #[1] -84.28907' – akrun

回答

1

可能會出現執行順序中的大括號問題。在第一種情況下,由於運營商優先權,ta[[3]]*log(w[[3]]首先發生,然後輸出被添加到dnorm(my[[3]], log = TRUE)

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

然而,下面,我們正與(log(w[3]) + dnrom(mylist[[3]], log = TRUE))的總和,因爲它是大括號內乘以ta[[3]]

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 
+1

它是驚人的。但是,我檢查了我的大括號,他們很好!我可能還會想念他們嗎? – Alice

+1

是的,我剛剛看到了。 – Alice

+1

@Alice當你發佈這個問題時,我恰好在線。我很樂意幫助你。 – akrun