2016-11-16 37 views
0

我有下面的代码,其中我有一个循环以上,其被馈送以单个值X可变数据

n = 25 
X = 1  
p = 0.2  #probability 

P = matrix(c(p, 1-p, 0, 0, 0, 0, 
       p, 0, 1-p, 0, 0, 0, 
       p, 0, 0, 1-p, 0, 0, 
       0, p, 0, 0, 1-p, 0, 
       0, 0, p, 0, 0, 1-p, 
       0, 0, 0, p, 0, 1-p), 
       ncol=6, nrow=6, byrow = TRUE)  #transition matrix 

for(i in 1:n){ 
    Y = runif(1)   #uniform sample 
    k = P[X[i], ]  #calculate k values 
    k = cumsum(k) 
    if(Y <= k[1]){  #update the chain 
    X[i+1] = 1} 
    else if(Y <= k[2]){ 
    X[i+1] = 2} 
    else if (Y <= k[3]){ 
    X[i+1] = 3} 
    else if (Y<=k[4]){ 
    X[i+1] = 4} 
    else if (Y<=k[5]){ 
    X[i+1] = 5} 
    else {X[i+1]=6} 
    } 

plot(1:n, X[1:i], type = 's') 

我想知道,可以设置我的X像多数据X = c(1,3,4),这样我可以只用一行代码就可以运行X的所有三个值,而不必通过更改X的值来重新进行重新计算?应该生成三张图。

+0

你想出口地块为PDF?我是否正确理解?:您正在寻找1行代码,这会产生三个输入值“X”的图表? –

回答

0

首先,如果您想重新使用该代码,您需要将代码放入函数中。其次,在您发布的代码,您绘制的图形在图形设备,您绘制别的东西后会丢失,所以你可能想将其保存为PDF或PNG或者类似的东西:

xtoplot <- function(X, n = 25, p = 0.2, transit = P){ 
    for(i in 1:n){ 
    Y <- runif(1)   # uniform sample 
    k <- P[X[i], ]  # calculate k values 
    k <- cumsum(k) 
    if(Y <= k[1]){   # update the chain 
     X[i+1] <- 1} 
    else if(Y <= k[2]){ 
     X[i+1] <- 2} 
    else if(Y <= k[3]){ 
     X[i+1] <- 3} 
    else if(Y <= k[4]){ 
     X[i+1] <- 4} 
    else if(Y <= k[5]){ 
     X[i+1] <- 5} 
    else{ 
     X[i+1] <- 6} 
    } 

    pltname <- paste0("plot_", X, ".pdf")  # The document name of the plot 

    pdf(pltname)     # Tell R to prepare to export something to PDF 
    plot(1:n, X[1:i], type = 's') # The plot to be exported 
    dev.off()      
} 

现在,功能到位,你可以使用的“apply() - 家庭”的成员才能运行多个输入值的函数X这样的:

lapply(c(1,3,4), xtoplot) 

在你的工作目录,你会发现三个PDF文件称为plot_1.pdf,plot_3.pdf和plot_4.pdf与您正在寻找的图表。

+0

非常感谢你。有用。 :d –