2 Stimmen

Re: Zufällige Auswahl von Werten aus einer Matrix, Hinzufügen von for-Schleifen (in R)

Mögliches Duplikat:
Zufällige Auswahl von Werten aus einer bestehenden Matrix nach Hinzufügen eines Vektors (in R)

Dies ist eine Folgefrage zu meiner Frage von letzter Woche und findet sich unter aquí . Ich war mir nicht sicher, ob es angemessen ist, diese Frage an der gleichen Stelle zu stellen oder sie als neue Frage zu stellen.

Okay, das letzte Mal habe ich nach dem zufälligen Entfernen von Werten aus einer Matrix gefragt, nachdem ich einen neuen Vektor damit verbunden habe. Die Antworten waren sehr nützlich, aber ich habe einen Fehler gefunden, wenn ich eine nicht quadratische Matrix verwende. Ich habe den Code in einer Schleife laufen lassen und jedes Mal die Summe der Matrix genommen, um sicherzustellen, dass er richtig funktioniert, aber ich habe festgestellt, dass die Summe variiert, was bedeuten würde, dass der Code manchmal den falschen Wert in der Matrix auswählt (ich möchte, dass er nur Einsen auswählt und ersetzt).

Hier ist der Code:

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)
     }

In diesem Fall ist die Summe der Matrix manchmal 13 und manchmal 14, obwohl sie immer = sum(mat1) = 13 sein sollte.

Ich habe versucht, den Code auseinanderzunehmen, und ich denke, dass alles richtig funktioniert, außer der Funktion rows, die ich zugegebenermaßen nicht ganz verstehe.

1voto

Gavin Simpson Punkte 163780

Das Problem ist ein Merkmal der sample() . Ich werde die ursprüngliche Q aktualisieren, aber das Problem ist aufgrund einer einzigen 1 die in einer Spalte der Kandidatenmatrix beobachtet wird. Der Code, der die rows versucht, eine Stichprobe aus einer Menge von 1 zu ziehen. Leider habe ich vergessen, dass sample() hat die Eigenschaft, dass wenn das erste Argument ein Vektor der Länge 1 ist, sample() behandelt es so, als ob Sie eine Probe aus dem Set nehmen wollten 1 , ..., n donde n war der Wert des einzelnen Elements in der Menge, aus der Sie eigentlich eine Stichprobe ziehen wollten.

Ein einfaches Beispiel illustriert das Verhalten, wenn das Argument x a sample() ist ein Vektor der Länge 1:

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

Instinktiv sollten diese alle sein 4 Sie sind es aber nicht, weil es sich um ein dokumentiertes und wohlbekanntes Merkmal handelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X