2015-09-25 38 views
2

對於模擬研究,我需要創建n×n協方差矩陣。例如我可以輸入2×2協方差矩陣等r用給定方差和協方差創建簡單n×n協方差矩陣

 [,1] [,2] 
[1,] 1.0 1.5 
[2,] 1.5 2.0 

成r功能/對象:

var <- c(1,2) ## variances 
covar <- c(1.5,1.5) ## covariance(s) 
mat <- matrix(c(var[1],covar[1],covar[2],var[2]),ncol=length(var)) 

然後我只需要改變var & covar值以形成所述基質。但不幸的是,我不只是處理2x2s,而是2x2:30x30甚至更高!那麼是否有可能爲r中的任何nxn維矩陣只寫一個函數?

+1

所以你的問題是:你有大小爲n,大小爲n *的協方差的向量(方差的向量N- 1),你想建立你的n * n矩陣? –

+0

covar矢量的順序是什麼? (這對於構建矩陣很重要) –

+1

順便說一下,不要調用矢量'var'而是'變量'例如,'var'是函數的名稱... –

回答

2

你可以這樣做:

m <- diag(variance) 
m[lower.tri(m)] = m[upper.tri(m)] <- head(covar, length(covar)/2) 

例如:

variance = c(0.25, 0.75, 0.6) 
covar = c(0.1, 0.3, 0.2, 0.1, 0.3, 0.2) 

#>m 
#  [,1] [,2] [,3] 
#[1,] 0.25 0.10 0.3 
#[2,] 0.10 0.75 0.2 
#[3,] 0.30 0.20 0.6 
+0

就是這樣的人。你救了我。我希望我可以添加+100 :) – SlightlyBuilt

+0

@SlightlyBuilt你也可以upvote,這將是另一個+10 :) http://meta.stackexchange.com/questions/686/accepting-answer-without-upvoting – zx8754

+0

@Colonel Beauvel我認爲你的答案應該是'm = diag(方差); m [lower.tri(m)] = head(covar,長度(covar)/ 2); m [upper.tri(m)] = t(m)[upper.tri(m)]'並且需要編輯。 – SlightlyBuilt