2

我正在从事教育任务,以使用 R 语言软件从 BIB 设计中生成发生率矩阵。我找到了一个与问题相关的网页http://wiki.math.yorku.ca/index.php/R:_Incidence_matrix 。但它产生数据矩阵而不是发生矩阵。任何人都可以帮我解决R语言代码。获取 BIB 设计矩阵的代码为:

b=4                                  # Number of Blocks  
t=8                                  # Number of Column
z=c(1,2,3)                           # Shift
m=NULL
y=c(0)
w=c(y,cumsum(z) %%t)                 # cumsum() is for the running totals
p=seq(from=0, to=t-1, by=1)
l=NULL

for(i in 1:b)  
 {
     for(j in 1:t) 
        {
            l=c(l,rep((w[i]+p[j]+t)%% t))
         }
  }
#"BIB design" it has 4 rows (blocks b) and 8 column (treatments t)
x= matrix(c(l),nrow=b,ncol=t,byrow = TRUE)  
 print (x)

0    1    2    3    4    5    6    7   
1    2    3    4    5    6    7    0   
3    4    5    6    7    0    1    2    
6    7    0    1    2    3    4    5   

(通常可以在任何 t 处理和 b 块大小下生成)使用上述设计矩阵 x (4*8)。我需要以下发生矩阵(8 * 8)

1   1   0   1    0    0   1    0       
0   1   1   0    1    0   0    1        
1   0   1   1    0    1   0    0     
0   1   0   1    1    0   1    0       
0   0   1   0    1    1   0    1       
0   1   0   0    1    0   1    1   
1   0   1   0    0    1   0    1    

考虑 Design Matrix Column wise 并生成 Incidence Matrix Row wise。例如 x 的第一列是

0   
1    
6    
3   

现在查看所需的发生矩阵 (IM) 的第一行。

1   1   0   1    0    0   1    0     

x 的第 1 位是 0,所以将 1 放在 IM 的第 1 位。

在 x 的第 2 位是 1,所以也将 1 放在 IM 的第 2 位。

这里 x 列中缺少 2,因此将 0 放在 IM 的第 3 位。

x 包含 3,因此将 1 放在第 4 位,4 和 5 丢失,连续放置两个 0。

X 有 6 把 1 放在第 7 位,7 把 0 放在 IM 的第 8 位。

取 x 的第 2 列并以类似方式填充 IM 的第 2 行。如果存在特定数字(0 到 7),则输入 1,否则输入 0。

我希望,我现在对每个人都说清楚。

4

2 回答 2

2

使 x 矩阵不同以在一列中有两个相同的条目我得到这个逻辑工作:

x[4,1] <- 1
t( apply(x, 2, function(z){ ret <- numeric(8)
                            for( i in seq_along(z) ){ret[z[i]+1] <- ret[z[i]+1]+ 1}
                            ret}) )

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    0    1    0    0    0    0
[2,]    0    1    1    0    1    0    0    1
[3,]    1    0    1    1    0    1    0    0
[4,]    0    1    0    1    1    0    1    0
[5,]    0    0    1    0    1    1    0    1
[6,]    1    0    0    1    0    1    1    0
[7,]    0    1    0    0    1    0    1    1
[8,]    1    0    1    0    0    1    0    1
于 2012-12-06T07:42:55.250 回答
0

我不完全确定通过获得预期输出的方式。但是,您获得比预期更长的输出的原因可能是由于[ as.factor(vec),]您的代码的一部分。

as.factor(vec)正在把你的4x4 matrix东西变成一个包含 16 个元素的向量。(好吧,从技术上讲, vec 已经是一个向量,但我们不要混淆事物)。

as.factor(vec)
[1] 0 1 3 2 1 2 0 3 2 3 1 0 3 0 2 1
Levels: 0 1 2 3

然后,您将其用作索引,它重复 A 的值。



** 顺便问一下,你确定你应该得到一个全 1 的矩阵吗?也许不只是对角线上的 1?

contrasts( as.factor(vec), contrasts =FALSE)
#    0 1 2 3
#  0 1 0 0 0
#  1 0 1 0 0
#  2 0 0 1 0
#  3 0 0 0 1
于 2012-12-06T04:27:30.673 回答