2

重複の可能性:
ベクトルを追加した後、既存の行列から値をランダムに選択します(R内)

これは先週からの私の質問へのフォローアップであり、ここで見つけることができます。この質問を同じ場所に投稿するのが適切か、それとも新しい質問として投稿するのが適切かはわかりませんでした。

さて、前回、新しいベクトルをマトリックスにバインドした後、マトリックスからランダムに値を削除することについて質問しました。答えは非常に役に立ちましたが、非正方行列を使用しているときにバグを見つけました。コードをループで実行し、マトリックスの合計を毎回取得して、正しく機能していることを確認しましたが、合計が変化することがわかりました。これは、コードがマトリックスで間違った値を選択していることを意味します。 (私はそれが1つだけを選択して置き換えることを望みます)。

コードは次のとおりです。

mat1<-matrix(c(1,0,1,0, 0,1,1,1, 1,0,0,0, 1,0,0,1, 1,1,1,1, 0,0,0,1),byrow=F, nrow=4)
I.vec<-c(0,1,1,1,0,0)


foo <- function(mat, vec) {
nr <- nrow(mat)
nc <- ncol(mat)
cols <- which(vec == 1L)
rows <- sapply(seq_along(cols), 
    function(x, mat, cols) {
        ones <- which(mat[,cols[x]] == 1L)
        sample(ones, 1)
        }, mat = mat, cols = cols)
ind <- (nr*(cols-1)) + rows
mat[ind] <- 0
mat <- rbind(mat, vec)
rownames(mat) <- NULL
mat
}

set.seed(2)

for (j in 1:1000){                             #run this vector through the simulations
     I.vec2=sample(I.vec,replace=FALSE)       #randomize interactions
     temp=foo(mat1,I.vec2)                    #run foo function
     prop=sum(temp)
     print.table(prop)
     }

この場合、行列の合計が13になることもあれば、14になることもありますが、常に= sum(mat1)=13である必要があります。

私はコードを分解しようとしましたが、行関数を除いてすべてが正しく機能していると思います。確かに、私は完全には理解していません。

4

1 に答える 1

1

問題は の機能ですsample()。元の Q を更新しますが、問題は1候補行列の列で単一が観測されているためです。生成するコードrowsは、1 のセットからサンプリングしようとしています。残念ながら、sample()最初の引数が長さ 1 のベクトルのsample()場合、セットからサンプリングしたい場合と同様に扱うという機能があることを忘れていました1...あなたが本当にサンプリングしたいセットの単一要素の値はnどこにありましたか。n

簡単な例は、引数xtosample()が長さ 1 のベクトルである場合の動作を示しています。

> set.seed(1)
> replicate(10, sample(4, 1))
 [1] 2 2 3 4 1 4 4 3 3 1

本能的に、これらはすべて である必要がありますが4、この文書化されたよく知られている機能のためではありません。

于 2011-08-04T00:56:06.483 に答える