繁体   English   中英

逐行填充下部矩阵,而不是列

[英]Fill lower matrix with vector by row, not column

我试图读取由LISREL以下列格式在纯文本,空白分隔文件中写出的方差 - 协方差矩阵:

 0.23675E+01  0.86752E+00  0.28675E+01 -0.36190E+00 -0.36190E+00  0.25381E+01
-0.32571E+00 -0.32571E+00  0.84425E+00  0.25598E+01 -0.37680E+00 -0.37680E+00
 0.53136E+00  0.47822E+00  0.21120E+01 -0.37680E+00 -0.37680E+00  0.53136E+00
 0.47822E+00  0.91200E+00  0.21120E+01

这实际上是一个较低的对角矩阵(包括对角线):

 0.23675E+01  
 0.86752E+00  0.28675E+01 
-0.36190E+00 -0.36190E+00  0.25381E+01
-0.32571E+00 -0.32571E+00  0.84425E+00  0.25598E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.21120E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.91200E+00  0.21120E+01

我可以使用scan()read.table(fill=T)正确读取值。

但是,我无法将读入矢量正确存储在矩阵中。 以下代码

S <- diag(6)
S[lower.tri(S,diag=T)] <- d

按列填充下面的矩阵,而它应该按行填充。

使用matrix()确实允许选项byrow=TRUE ,但这将填充整个矩阵,而不仅仅是下半部分(带对角线)。

有两种可能:只填充下面的矩阵(用对角线) 并按行进行吗?

(我遇到的另一个问题是:LISREL使用'D + 01'而R只识别'E + 01'用于科学记数法。你可以在R中改变它以接受'D'吗?)

只需将其读入上三角部分,而不是下部:

S <- diag(6)
S[upper.tri(S, diag=TRUE)] <- d
t(S)

sem包有一个非常好的函数, read.moments()旨在实现这一目的:

foo <- read.moments()
 0.23675E+01  
 0.86752E+00  0.28675E+01 
-0.36190E+00 -0.36190E+00  0.25381E+01
-0.32571E+00 -0.32571E+00  0.84425E+00  0.25598E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.21120E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.91200E+00  0.21120E+01

foo[upper.tri(foo)] <- t(foo)[upper.tri(foo)]

这给你:

         X1       X2       X3       X4       X5       X6
X1  2.36750  0.86752 -0.36190 -0.32571 -0.37680 -0.37680
X2  0.86752  2.86750 -0.36190 -0.32571 -0.37680 -0.37680
X3 -0.36190 -0.36190  2.53810  0.84425  0.53136  0.53136
X4 -0.32571 -0.32571  0.84425  2.55980  0.47822  0.47822
X5 -0.37680 -0.37680  0.53136  0.47822  2.11200  0.91200
X6 -0.37680 -0.37680  0.53136  0.47822  0.91200  2.11200

编辑1:至于scan()的问题,仅仅因为它最初打印为下三角形并不意味着你必须将它放在下三角形:)只需将它放在上面:

foo <- scan()
 0.23675E+01  
 0.86752E+00  0.28675E+01 
-0.36190E+00 -0.36190E+00  0.25381E+01
-0.32571E+00 -0.32571E+00  0.84425E+00  0.25598E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.21120E+01 
-0.37680E+00 -0.37680E+00  0.53136E+00  0.47822E+00  0.91200E+00  0.21120E+01

bar <- matrix(0,6,6)

bar[upper.tri(bar,diag=TRUE)] <- foo

bar[lower.tri(bar)] <- t(bar)[lower.tri(bar)]

EDIT2:至于D符号的问题,如果我理解正确,可以通过先扫描字符来修复,将Ds gsub为E并强制为数字:

foo <- scan(what="character")
 0.23675D+01  
 0.86752D+00  0.28675D+01 
-0.36190D+00 -0.36190D+00  0.25381D+01
-0.32571D+00 -0.32571D+00  0.84425D+00  0.25598D+01 
-0.37680D+00 -0.37680D+00  0.53136D+00  0.47822D+00  0.21120D+01 
-0.37680D+00 -0.37680D+00  0.53136D+00  0.47822D+00  0.91200D+00  0.21120D+01


bar <- matrix(0,6,6)

bar[upper.tri(bar,diag=TRUE)] <- as.numeric(gsub("D","E",foo))

bar[lower.tri(bar)] <- t(bar)[lower.tri(bar)]

bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM