2016-03-17 47 views
1

我想從泊松分佈使用Lambda矢量得到一個概率矩陣。 我想:如何獲得多個x和多個lambda的dpois結果?

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 

我得到x的probs [I]和λ[I],而不是每個拉姆達的所有probs X

我想知道如何做到這一點不使用循環...

換句話說

我想插入dpois()x和拉姆達兩個向量,並得到所有可能的probabil ity組合。

回答

0

要創建所有向量組合對,您需要使用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 
+0

真棒!!!! 非常感謝... 我不知道爲什麼我自己沒有想到它( - : – user3812439

+1

或者,要獲得矩陣請求'外(x,Lamda,dpois)' – user20637

+0

...並且if你需要矩陣尺寸爲'res < - outer(x,Lamda,dpois); dimnames(res)= list(x = x,Lamda = Lamda)' – user20637

3

您提出要「概率矩陣」你可以得到雙rectly與

> 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 

得到一些標籤矩陣的各個維度......但我認爲這有點太聰明,我更喜歡額外的一兩行和清晰度: - }

+1

略好於'名稱< - ()'是'setNames()' –

+0

@BenBolker真 - 我不知道'setNames()',感謝指針。 – user20637