2016-03-17 1 views
1

Я пытаюсь получить матрицу вероятности из распределения Пуассона, используя вектор Лямбды. то, что я хочу получить:Как получить результаты dpois для нескольких x и нескольких лямбда?

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 

я получить Probs х [я] с лямбда [я], а не для каждого лямбда все Probs из х

я хочу знать, как сделать это без использования цикла ...

других слов я хотел бы вставить в dpois() два вектора для й и лямбды, и получить всю возможную probabil .

ответ

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

awesome !!!! Большое спасибо ... Я не знаю, почему я сам не думал об этом (-: – user3812439

+1

В качестве альтернативы, чтобы получить требуемую матрицу 'outer (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

немного лучше, чем 'names <-()' is 'setNames()' –

+0

@BenBolker True - я не знал о 'setNames()', спасибо за указатель. – user20637

Смежные вопросы