Матрицы взвешенной дисперсии-ковариации и

У меня есть список prob с 50 элементами. Каждый элемент представляет собой матрицу вероятностей 601x3, каждая строка которой представляет полное пространство выборки (т. е. каждая строка каждой матрицы в сумме равна 1). Например, вот первые пять строк первого элемента prob:

> prob[[1]][1:5,]

           [,1]      [,2]       [,3]
 [1,] 0.6027004 0.3655563 0.03174335
 [2,] 0.6013667 0.3665756 0.03205767
 [3,] 0.6000306 0.3675946 0.03237481
 [4,] 0.5986921 0.3686131 0.03269480
 [5,] 0.5973513 0.3696311 0.03301765

Теперь я хочу создать следующую матрицу для каждой строки каждой матрицы/элемента в списке prob. Взяв первую строку, пусть a = 0,603, b = 0,366 и c = 0,032 (округление до трех знаков после запятой). Затем,

> w
         [,1]       [,2]       [,3]
 [1,] a*(1-a)       -a*b       -a*c
 [2,]    -b*a    b*(1-b)       -b*c
 [3,]    -c*a       -c*b    c*(1-c)

Такой, что:

> w
           [,1]       [,2]       [,3]
 [1,]  0.239391  -0.220698  -0.019296
 [2,] -0.220698   0.232044  -0.011712
 [3,] -0.019296  -0.011712   0.030976

Я хочу получить аналогичную матрицу 3x3 еще 600 раз (для остальных строк этой матрицы), а затем повторить весь этот процесс еще 49 раз для остальных элементов prob. Единственное, что я могу придумать, это вызвать apply внутри lapply, чтобы я получал доступ к каждой строке каждой матрицы по очереди. Я уверен, что это не элегантный способ сделать это (не говоря уже о том, что я не могу заставить его работать), но я не могу думать ни о чем другом. Может ли кто-нибудь помочь мне с этим? Я также хотел бы услышать предложения по использованию другой структуры (например, плохо ли использовать матрицы в списках?).


person psychometriko    schedule 04.12.2012    source источник
comment
Является ли матрица 601*50 результатом, который вы ищете? У вас есть идея, как бы вы хотели их хранить (в виде списка, в одной матрице)? Или, может быть, вам не нужно их хранить.   -  person djhurio    schedule 04.12.2012
comment
Я не совсем уверен, какой тип вывода я ищу - я не могу решить, что было бы лучше в этом случае. Решение массива, показанное ниже, выглядит многообещающе. Я определенно хочу сохранить вывод. Мне нужно будет использовать эти матрицы 3x3 сразу после их создания.   -  person psychometriko    schedule 04.12.2012


Ответы (1)


Запуск этого процесса с lapply в списке матриц аналогичного размера должен быть очень простым. Если это представляет собой проблему, вы должны опубликовать вывод dput(.) для списка из двух элементов с похожими матрицами. На самом деле задача состоит в том, чтобы выполнять обработку построчно, что показано здесь с выходом в виде массива 3x3xN:

w <- apply(M, 1, function(rw) diag( rw*(1-rw) ) + 
                    rbind( rw*c(0, -rw[1], -rw[1] ), 
                           rw*c(-rw[2],0, -rw[2] ),
                           rw*c(-rw[3], -rw[3], 0)
         )

 )
 w
             [,1]        [,2]        [,3]        [,4]        [,5]
 [1,]  0.23945263  0.23972479  0.23999388  0.24025987  0.24052272
 [2,] -0.22032093 -0.22044636 -0.22056801 -0.22068575 -0.22079962
 [3,] -0.01913173 -0.01927842 -0.01942588 -0.01957412 -0.01972314
 [4,] -0.22032093 -0.22044636 -0.22056801 -0.22068575 -0.22079962
 [5,]  0.23192489  0.23219793  0.23246881  0.23273748  0.23300395
 [6,] -0.01160398 -0.01175156 -0.01190081 -0.01205173 -0.01220435
 [7,] -0.01913173 -0.01927842 -0.01942588 -0.01957412 -0.01972314
 [8,] -0.01160398 -0.01175156 -0.01190081 -0.01205173 -0.01220435
 [9,]  0.03073571  0.03102998  0.03132668  0.03162585  0.03192748

 w <- array(w, c(3,3,5) )
 w
, , 1

            [,1]        [,2]        [,3]
[1,]  0.23945263 -0.22032093 -0.01913173
[2,] -0.22032093  0.23192489 -0.01160398
[3,] -0.01913173 -0.01160398  0.03073571

, , 2

            [,1]        [,2]        [,3]
[1,]  0.23972479 -0.22044636 -0.01927842
[2,] -0.22044636  0.23219793 -0.01175156
[3,] -0.01927842 -0.01175156  0.03102998

.... snipped remaining output
person IRTFM    schedule 04.12.2012
comment
Спасибо за ваше предложение использовать массивы @DWin - я думаю, что в конечном итоге я пойду по этому пути. Я немного смущен вашим примером, но, скорее всего, это просто мои ограниченные знания R. Я думаю, что этого было достаточно, чтобы указать мне правильное направление, так что спасибо! - person psychometriko; 05.12.2012
comment
Мне жаль, что это было запутанно. В основном я просто добавляю диагональную матрицу к матрице с недиагональными элементами вашей спецификации для каждой строки. Это дает мне 9-строчную матрицу, в которой каждый столбец построен из одной строки вашего ввода. Поскольку матрицы и массивы в R являются основными по столбцам, вы можете превратить каждый из этих столбцов в срез массива 3 x 3, который имеет столько срезов, сколько ваших входных данных имеет строк. Вы получаете один фрагмент за раз с помощью w[ , , 1] ; w[ ,, 2] и т. д. - person IRTFM; 05.12.2012
comment
О, я вижу - это имеет смысл! Спасибо за знания! - person psychometriko; 07.12.2012