我有4种说明,比如 I1,I2,I3,I4 ,我必须根据以下概率在程序中操作这些指令:
- 有1%的几率,我使用 I1
- 有85%的几率,我使用 I2
- 有7%的几率,我使用 I3
- 有7%的几率,我使用 I4
(注意:1%+ 85%+ 7%+ 7%= 100%)
每条指令创建一个2坐标点(x,y),我在数据框 df 中堆叠。
我知道我可以使用以下代码执行此操作:
df <- c(0,0)
for (i in 1:n)
{
x <- sample(1:100, 1)
if (x==1) { I1 }
if (x>=2 & x<=86) { I2 }
if (x>=87 & x<=93) { I3 }
if (x>=94 & x<=100) { I4 }
df <- rbind(df, c(x, y))
}
但就“ n ”而言,这是非常耗时的。我想对代码进行矢量化,以加快处理速度,但我找不到如何 有什么想法吗?
完全理解:该计划旨在重现所谓的巴恩斯利蕨类植物。
A1 <- matrix(c(0,0,0,0.16), byrow=FALSE, ncol=2)
V1 <- matrix(c(0,0), byrow=FALSE, ncol=1)
A2 <- matrix(c(0.85,-0.04,0.04,0.85), byrow=FALSE, ncol=2)
V2 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A3 <- matrix(c(0.2,0.23,-0.26,0.22), byrow=FALSE, ncol=2)
V3 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A4 <- matrix(c(-0.15,0.26,0.28,0.24), byrow=FALSE, ncol=2)
V4 <- matrix(c(0,0.44), byrow=FALSE, ncol=1)
z1 <- matrix(c(0,0), byrow=FALSE, ncol=1)
df <- as.data.frame(t(z1))
for (i in 1:1000)
{
x <- sample(1:100, 1)
if (x==1) { z2 <- A1%*%z1 + V1}
if (x>=2 & x<=86) { z2 <- A2%*%z1 + V2}
if (x>=87 & x<=93) { z2 <- A3%*%z1 + V3}
if (x>=94 & x<=100) { z2 <- A4%*%z1 + V4}
df <- rbind(df, t(z2))
z1 <- z2
}
plot(df$V1, df$V2, xlab="", ylab="")
答案 0 :(得分:0)
采样功能可以进行矢量化。这是一个可以满足您需求的简单示例。
n<- 100
sampling<- sample( c(I1(), I2(), I3(), I4()), n, replace=TRUE, prob=c(1,85,7,7))
df <- data.frame( x=1:n, y=sampling)
#run these lines first
#define your functions
I1 <- function() { return(10)}
I2 <- function() { return(20)}
I3 <- function() { return(30)}
I4 <- function() { return(40)}
这应该是你所需要的。只需记住在尝试评估样本函数之前定义函数。
注意:阅读完编辑后,说明不是常数,但会根据先前的值而有所不同,因此上述方法不起作用。