如何获得多个 x 和多个 lambda 的 dpois 结果?
How to get dpois results for multiple x and multiple lambda?
我正在尝试使用 Lambda 向量从泊松分布中获取概率矩阵。
我想得到什么:
x<-seq(1,3,1)
Lambda<-seq(1,2,0.5)
dpois(x,Lambda[1])
[1] 0.36787944 0.18393972 0.06131324
dpois(x,Lambda[2])
[1] 0.3346952 0.2510214 0.1255107
dpois(x,Lambda[3])
[1] 0.2706706 0.2706706 0.1804470
当我这样做的时候:
dpois(x,Lambda)
[1] 0.3678794 0.2510214 0.1804470
i 用 Lambda[i] 得到 x[i] 的概率,而不是每个 lambda 得到 x
的所有概率
我想知道如何不使用循环...
换句话说,我想在 dpois() 中插入 x 和 lambda 的两个向量,并获得所有可能的概率组合。
要创建所有向量组合的对,您需要使用 expand.grid
函数。
x <- seq(1, 3, 1)
Lambda <- seq(1, 2, 0.5)
grid <- expand.grid(x=x, Lambda=Lambda)
dpois(grid$x, grid$Lambda)
当 R 以矢量化方式执行某些操作时,它会将较短的矢量对齐并重复为最长的矢量,如下例所示:
> cbind(1:5, 1:8, 1:2, 1:3)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 1 3
[4,] 4 4 2 1
[5,] 5 5 1 2
[6,] 1 6 2 3
[7,] 2 7 1 1
[8,] 3 8 2 2
因此,另一种方法是让最长的向量足够长,以便较短的向量能够重复足够多的次数,从而创建所有组合:
> x <- 1:2
> y <- 1:3
> cbind(x,y)
x y
[1,] 1 1
[2,] 2 2
[3,] 1 3
Warning message:
In cbind(x, y) :
number of rows of result is not a multiple of vector length (arg 1)
> cbind(rep(x, each=length(y)), y)
y
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 2 1
[5,] 2 2
[6,] 2 3
您要求 "a probability matrix" 可以直接使用
> x<-seq(1,3,1)
> Lamda<-seq(1,2,0.5)
> outer(x, Lamda, dpois)
[,1] [,2] [,3]
[1,] 0.36787944 0.3346952 0.2706706
[2,] 0.18393972 0.2510214 0.2706706
[3,] 0.06131324 0.1255107 0.1804470
如果您想要标注矩阵维度,您可以使用
> res <- outer(x, Lamda, dpois)
> dimnames(res) <- list(x=x, Lamda=Lamda)
> res
Lamda
x 1 1.5 2
1 0.36787944 0.3346952 0.2706706
2 0.18393972 0.2510214 0.2706706
3 0.06131324 0.1255107 0.1804470
您可以在一行中完成并使用 names<-()
获得一些标签
> outer(`names<-`(x,x), `names<-`(Lamda,Lamda), dpois)
1 1.5 2
1 0.36787944 0.3346952 0.2706706
2 0.18393972 0.2510214 0.2706706
3 0.06131324 0.1255107 0.1804470
...但我认为这有点太聪明了,我更喜欢额外的一两行和清晰度:-}
我正在尝试使用 Lambda 向量从泊松分布中获取概率矩阵。 我想得到什么:
x<-seq(1,3,1)
Lambda<-seq(1,2,0.5)
dpois(x,Lambda[1])
[1] 0.36787944 0.18393972 0.06131324
dpois(x,Lambda[2])
[1] 0.3346952 0.2510214 0.1255107
dpois(x,Lambda[3])
[1] 0.2706706 0.2706706 0.1804470
当我这样做的时候:
dpois(x,Lambda)
[1] 0.3678794 0.2510214 0.1804470
i 用 Lambda[i] 得到 x[i] 的概率,而不是每个 lambda 得到 x
的所有概率我想知道如何不使用循环...
换句话说,我想在 dpois() 中插入 x 和 lambda 的两个向量,并获得所有可能的概率组合。
要创建所有向量组合的对,您需要使用 expand.grid
函数。
x <- seq(1, 3, 1)
Lambda <- seq(1, 2, 0.5)
grid <- expand.grid(x=x, Lambda=Lambda)
dpois(grid$x, grid$Lambda)
当 R 以矢量化方式执行某些操作时,它会将较短的矢量对齐并重复为最长的矢量,如下例所示:
> cbind(1:5, 1:8, 1:2, 1:3)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 1 3
[4,] 4 4 2 1
[5,] 5 5 1 2
[6,] 1 6 2 3
[7,] 2 7 1 1
[8,] 3 8 2 2
因此,另一种方法是让最长的向量足够长,以便较短的向量能够重复足够多的次数,从而创建所有组合:
> x <- 1:2
> y <- 1:3
> cbind(x,y)
x y
[1,] 1 1
[2,] 2 2
[3,] 1 3
Warning message:
In cbind(x, y) :
number of rows of result is not a multiple of vector length (arg 1)
> cbind(rep(x, each=length(y)), y)
y
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 2 1
[5,] 2 2
[6,] 2 3
您要求 "a probability matrix" 可以直接使用
> x<-seq(1,3,1)
> Lamda<-seq(1,2,0.5)
> outer(x, Lamda, dpois)
[,1] [,2] [,3]
[1,] 0.36787944 0.3346952 0.2706706
[2,] 0.18393972 0.2510214 0.2706706
[3,] 0.06131324 0.1255107 0.1804470
如果您想要标注矩阵维度,您可以使用
> res <- outer(x, Lamda, dpois)
> dimnames(res) <- list(x=x, Lamda=Lamda)
> res
Lamda
x 1 1.5 2
1 0.36787944 0.3346952 0.2706706
2 0.18393972 0.2510214 0.2706706
3 0.06131324 0.1255107 0.1804470
您可以在一行中完成并使用 names<-()
> outer(`names<-`(x,x), `names<-`(Lamda,Lamda), dpois)
1 1.5 2
1 0.36787944 0.3346952 0.2706706
2 0.18393972 0.2510214 0.2706706
3 0.06131324 0.1255107 0.1804470
...但我认为这有点太聪明了,我更喜欢额外的一两行和清晰度:-}