2013-10-30 104 views
1

任何人都可以向我解释为什么这个代码的分布:的if-else逻辑流

InfectionHistory <- rep(1,100) 
for(x in 1:99) 
{ 
    r <- runif(1) 
    print(r) 
    if(InfectionHistory[x]==1) 
    { 
    if(r < 0.04) 
    { 
     InfectionHistory[x+1] <- 2 
    } 
    else 
    { 
     InfectionHistory[x+1] <- InfectionHistory[x] 
    } 
    } 
    if(InfectionHistory[x]==2) 
    { 
    if(r < 0.11) 
    { 
     InfectionHistory[x+1] <- 1 
    } 
    else 
    { 
     InfectionHistory[x+1] <- InfectionHistory[x] 
    } 
    } 
} 
plot(InfectionHistory, xlab = "Day", ylab = "State", main = "Patient Status per Day", type = "o") 

从这个代码不同:

InfectionHistory <- rep(1,100) 
for(x in 1:99) 
{ 
    r <- runif(1) 
    print(r) 
    if((InfectionHistory[x]==1)&&(r < 0.04)) 
    { 
    InfectionHistory[x+1] <- 2 
    } 
    if((InfectionHistory[x]==2)&&(r < 0.11)) 
    { 
    InfectionHistory[x+1] <- 1 
    } 
} 
plot(InfectionHistory, xlab = "Day", ylab = "State", main = "Patient Status per Day", type = "o") 

我觉得它与逻辑做if-else语句。代码的目标是模拟沿着马尔可夫链的感染模型

回答

0

第一个示例包含嵌套在if语句中的if else对。

第二个示例包含具有复合条件的if语句。

经过粗略的回顾,它看起来像每个例子应该做同样的事情。此代码充当嵌套if语句可以重写为具有复合条件的语句if的示例。

例如,例1中,当我们到了这行代码:

if(r < 0.04) 
{ 
    InfectionHistory[x+1] <- 2 
} 

我们已经知道,

InfectionHistory[x]==1 

返回true,否则我们就不会中检查此条件的if的正文。

在第二个例子中,这只是改写为:

if((InfectionHistory[x]==1)&&(r < 0.04)) 
{ 
    InfectionHistory[x+1] <- 2 
} 

编辑:再次看它,第二个例子似乎不具备办案:

else 
{ 
    InfectionHistory[x+1] <- InfectionHistory[x] 
} 

在第一个例子中重复了这一点代码。它与嵌套的if语句配对。第二个例子可以通过简单的if else if else结构很容易地被重写来处理这个问题。例如:

if((InfectionHistory[x]==1)&&(r < 0.04)) 
{ 
    InfectionHistory[x+1] <- 2 
} 
else if((InfectionHistory[x]==2)&&(r < 0.11)) 
{ 
    InfectionHistory[x+1] <- 1 
} 
else 
{ 
    InfectionHistory[x+1] <- InfectionHistory[x] 
} 
+0

没错,但我期待什么导致频率的巨大差异。实施例1在感染史上给出了比实施例2更多的2。是什么导致了这种情况发生?根据我的理解,如果两个代码块是逻辑对等块,那么它们应该返回非常类似于1和2的分布。 – user2938366

+0

@ user2938366我对感染模型或马尔可夫链一无所知。您是否尝试将示例2更改为我答案中的最后一个代码块? – nhgrif