Home > Blockchain >  Replacing pair of element of symmetric matrix with NA
Replacing pair of element of symmetric matrix with NA

Time:11-03

I have a positive definite symmetric matrix. Pasting the matrix generated using the following code:

set.seed(123)
m <- genPositiveDefMat(
    dim = 3, 
    covMethod = "unifcorrmat",
    rangeVar = c(0,1) )

x <- as.matrix(m$Sigma)
  diag(x) <- 1

x

#Output
          [,1]       [,2]       [,3]
[1,]  1.0000000 -0.2432303 -0.4110525
[2,] -0.2432303  1.0000000 -0.1046602
[3,] -0.4110525 -0.1046602  1.0000000


Now, I want to run the matrix through iterations and in each iteration I want to replace the symmetric pair with NA. For example,

Iteration 1: x[1,2] = x[2,1] <- NA

Iteration2: x[1,3] = x[3,1] <- NA

and so on....

My idea was to check using a for loop

Prototype:

for( r in 1:nrow(x)
for( c in 1:ncol(x)

if x[r,c]=x[c,r]<-NA

else

x[r,c]

The issue with my code is for row 1 and column 1, the values are equal hence it sets to 0 (which is wrong). Also, the moment it is not NA it comes out of the loop.

Appreciate any help here.

Thanks

CodePudding user response:

If you need the replacement done iteratively, you can use the indexes of values represented by upper.tri(x)/lower.tri to do the replacements pair-by-pair. That will allow you to pass the results to a function before/after each replacement, e.g.:

sel <- sapply(c(lower.tri, upper.tri), \(f) which(f(mat)) )
#     [,1] [,2]
#[1,]    2    4 ##each row represents the lower/upper pair
#[2,]    3    7
#[3,]    6    8

for( i in seq_len(nrow(sel)) ) {
    mat[ sel[i,] ] <- NA
    print(mean(mat, na.rm=TRUE))
}
#[1] 0.2812249
#[1] 0.5581359
#[1] 1
  • Related