如何获得多个 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

...但我认为这有点太聪明了,我更喜欢额外的一两行和清晰度:-}