具有与值对相关的随机实验的函数
Function with random experiment related to value pairs
我有两个向量 x1 和 p:
x1 <- c(1,2,3,1,2,3)
p <- c(0.1,0.9,0.9,0.1,0.5,0.7)
两个向量形成值对,参见 df1:
df1 <- data.frame(x1,p)
> df1
x1 p
1 1 0.1
2 2 0.9
3 3 0.9
4 1 0.1
5 2 0.5
6 3 0.7
以下函数用于根据随机实验和概率 p 将向量 df1$x1 更新为向量 df1$x2:
rexp <- function(x,p){
if(runif(1) <= p) return(x + 1)
return(x)
}
使用 lapply,函数 "rexp" 应用于每个 df1$x1 值。根据随机实验,x2 的值保持等于 x1 或增加 + 1。
在以下示例中,p 等于 0.5:
set.seed(123)
df1$x2 <- unlist(lapply(df1$x1,rexp,0.5))
> df1
x1 p x2
1 1 0.1 2
2 2 0.9 2
3 3 0.9 4
4 1 0.1 1
5 2 0.5 2
6 3 0.7 4
现在我的问题是:我希望 "rexp" 中的参数 "p" 引用向量 df1$p。
例如,df1$x1[1] 的 p 应为 0.1(如 df1$p[1] 中所示):unlist(lapply(df1$x1[1],rexp,df1$p[1 ])).
df1$x1[5] 的 p 应该是 df1$p[5],即 0.5:unlist(lapply(df1$x1[5],rexp,df1$p[5]))
期望的输出应该是这样的:
> unlist(lapply(df1$x1,rexp,df1$p))
[1] 1 3 4 1 2 4
#where 1 refers to rexp(df1$x1[1],df1$p[1]),
#3 refers to rexp(df1$x1[2],df1$p[2]),
#4 refers to rexp(df1$x1[3],df1$p[3]) and so on...
这样做 "manually" 会导致:
set.seed(123)
> unlist(lapply(df1$x1[1],rexp,df1$p[1]))
[1] 1
> unlist(lapply(df1$x1[2],rexp,df1$p[2]))
[1] 3
> unlist(lapply(df1$x1[3],rexp,df1$p[3]))
[1] 4
> unlist(lapply(df1$x1[4],rexp,df1$p[4]))
[1] 1
> unlist(lapply(df1$x1[5],rexp,df1$p[5]))
[1] 2
> unlist(lapply(df1$x1[6],rexp,df1$p[6]))
[1] 4
如何调整 "rexp" 以便函数对每个 df1$x1 值使用特定的 df1$p 值?
注意:此时,使用 "lapply" 很重要,因为对于函数 "rexp" 中的每个 df1$x1-value,都应抽取一个新的随机数。
我很高兴能得到任何帮助!
使用你定义的函数,你可以做
df1$x2 <- mapply(rexp, df1$x1, df1$p)
但是,您也可以利用向量化并简单地使用
df1$x2 <- df1$x1 + (runif(nrow(df1)) <= df1$p)
以这种方式,我们 element-wise 将向量 df1$x1
与逻辑向量 runif(nrow(df1)) <= df1$p
相加,该逻辑向量被强制转换为二进制向量(TRUE
变为 1 并且 FALSE
变为 0)。比较 <=
也已完成 element-wise,我们从均匀分布中提取与行数一样多的不同值。
关于您的方法,请注意当 p
固定时,就不需要 lapply
,因为它 returns 是一个列表,您可以改用
df1$x2 <- sapply(df1$x1, rexp, 0.5)
我有两个向量 x1 和 p:
x1 <- c(1,2,3,1,2,3)
p <- c(0.1,0.9,0.9,0.1,0.5,0.7)
两个向量形成值对,参见 df1:
df1 <- data.frame(x1,p)
> df1
x1 p
1 1 0.1
2 2 0.9
3 3 0.9
4 1 0.1
5 2 0.5
6 3 0.7
以下函数用于根据随机实验和概率 p 将向量 df1$x1 更新为向量 df1$x2:
rexp <- function(x,p){
if(runif(1) <= p) return(x + 1)
return(x)
}
使用 lapply,函数 "rexp" 应用于每个 df1$x1 值。根据随机实验,x2 的值保持等于 x1 或增加 + 1。 在以下示例中,p 等于 0.5:
set.seed(123)
df1$x2 <- unlist(lapply(df1$x1,rexp,0.5))
> df1
x1 p x2
1 1 0.1 2
2 2 0.9 2
3 3 0.9 4
4 1 0.1 1
5 2 0.5 2
6 3 0.7 4
现在我的问题是:我希望 "rexp" 中的参数 "p" 引用向量 df1$p。 例如,df1$x1[1] 的 p 应为 0.1(如 df1$p[1] 中所示):unlist(lapply(df1$x1[1],rexp,df1$p[1 ])). df1$x1[5] 的 p 应该是 df1$p[5],即 0.5:unlist(lapply(df1$x1[5],rexp,df1$p[5]))
期望的输出应该是这样的:
> unlist(lapply(df1$x1,rexp,df1$p))
[1] 1 3 4 1 2 4
#where 1 refers to rexp(df1$x1[1],df1$p[1]),
#3 refers to rexp(df1$x1[2],df1$p[2]),
#4 refers to rexp(df1$x1[3],df1$p[3]) and so on...
这样做 "manually" 会导致:
set.seed(123)
> unlist(lapply(df1$x1[1],rexp,df1$p[1]))
[1] 1
> unlist(lapply(df1$x1[2],rexp,df1$p[2]))
[1] 3
> unlist(lapply(df1$x1[3],rexp,df1$p[3]))
[1] 4
> unlist(lapply(df1$x1[4],rexp,df1$p[4]))
[1] 1
> unlist(lapply(df1$x1[5],rexp,df1$p[5]))
[1] 2
> unlist(lapply(df1$x1[6],rexp,df1$p[6]))
[1] 4
如何调整 "rexp" 以便函数对每个 df1$x1 值使用特定的 df1$p 值? 注意:此时,使用 "lapply" 很重要,因为对于函数 "rexp" 中的每个 df1$x1-value,都应抽取一个新的随机数。 我很高兴能得到任何帮助!
使用你定义的函数,你可以做
df1$x2 <- mapply(rexp, df1$x1, df1$p)
但是,您也可以利用向量化并简单地使用
df1$x2 <- df1$x1 + (runif(nrow(df1)) <= df1$p)
以这种方式,我们 element-wise 将向量 df1$x1
与逻辑向量 runif(nrow(df1)) <= df1$p
相加,该逻辑向量被强制转换为二进制向量(TRUE
变为 1 并且 FALSE
变为 0)。比较 <=
也已完成 element-wise,我们从均匀分布中提取与行数一样多的不同值。
关于您的方法,请注意当 p
固定时,就不需要 lapply
,因为它 returns 是一个列表,您可以改用
df1$x2 <- sapply(df1$x1, rexp, 0.5)