2

私は、R言語ソフトウェアを使用してBIB設計から接続行列を作成するための教育的割り当てに取り組んでいます。 問題に関連するWebページ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    

計画行列の列を考慮し、接続行列の行を生成します。たとえば、xの最初の列は

0   
1    
6    
3   

次に、必要な接続行列(IM)の最初の行を参照してください。

1   1   0   1    0    0   1    0     

xの1位は0なので、IMの1位に1を入れます。

xの2位は1なので、IMの2位にも1を入れます。

ここでは、xの列に2がないため、IMの3番目に0を配置します。

xには3が含まれているため、1を4番目に配置し、4と5が欠落しているため、2つの0を連続して配置します。

Xは7位に6プット1があり、IMの8位に7プット0がありません。

xの2番目の列と、同様に入力されたIMの2番目の行を取得します。特定の番号(0から7)が存在する場合は、1を入力し、それ以外の場合はゼロにします。

私は今、すべての人にそれを明確にしたいと思います。

4

2 に答える 2

2

x行列を異なるものにして、1つの列に2つの同一のエントリを含めると、次のロジックが機能します。

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 に答える