Erstellen Sie eine Zufallsmatrix mit konstanten Zeilensummen in R
In diesem Artikel werden wir sehen, wie man eine Matrix mit zufällig ausgewählten nicht negativen Werten in jeder Zeile erstellt, sodass die Summe für alle Zeilen konstant ist.
Der Einfachheit halber nehmen wir den Fall, in dem alle Zeilen die Summe 1 ergeben. Die Zeilenvektoren können mit einer beliebigen Zahl multipliziert werden, um diese Zahl als Zeilensumme zu erhalten.
Erstellen Sie eine Zufallsmatrix mit konstanten Zeilensummen in R
Angenommen, wir möchten, dass jede Zeile 4 Elemente enthält. Dies kann eine beliebige positive ganze Zahl größer als 1 sein.
Wir beginnen mit dem Bereich von 0 bis 100, der die Perzentile darstellt. Wir werden diesen Bereich in 4 Teile unterteilen, indem wir 3 zufällig ausgewählte Schnittpunkte verwenden.
Dazu haben wir zufällig 3 Punkte aus dem genannten Bereich ausgewählt. Der Einfachheit halber wählen wir 3 separate Zahlen.
Wir werden die gewählten Schnittpunkte in absteigender Reihenfolge sortieren. Dies sind die Perzentile, bei denen wir den Bereich begrenzen.
Wir teilen die Schnittpunkte durch 100. Dies gibt uns die Schnittpunkte als Dezimalstellen von 0 bis 1.
Wir erhalten unsere vier Abschnitte von 1 wie folgt:
- Wir erhalten das erste Element, indem wir den ersten (größten) Schnittpunkt von 1 subtrahieren.
- Wir erhalten das zweite Element, indem wir den zweiten Schnittpunkt vom ersten Schnittpunkt subtrahieren.
- Wir erhalten das dritte Element, indem wir den dritten (kleinsten) Schnittpunkt vom zweiten Schnittpunkt subtrahieren.
- Wir erhalten das vierte Element, indem wir 0 vom dritten Schnittpunkt subtrahieren.
Diese Zahlen bilden eine Reihe; sie addieren sich zu 1. Wir müssen diesen Vorgang so oft wiederholen, wie die Anzahl der Zeilen benötigt wird.
Code für die Matrix
Wir werden uns nun den Code ansehen, um eine Zufallsmatrix mit 5 Zeilen und 4 Spalten zu erhalten, wobei jede Zeilensumme 1 ist.
Beispielcode:
# The final matrix.
# It begins as an empty matrix. It has 4 columns in our example.
Mx = matrix(byrow= TRUE, ncol = 4, nrow = 0)
# The number of rows. 5 rows in our example.
# We will repeat the code as many times as the number of rows we need.
for(RowNum in 1:5) {
# Cut points. With 3 cuts, we will get 4 elements.
# Randomly choose 3 different integers from the sequence 0 to 100.
cuts = sample(0:100, 3, replace = FALSE)
# Sort the cut points in descending order.
cuts.sort = sort(cuts, decreasing = TRUE)
# Convert the sorted cut points to decimals from 0 to 1.
cuts.dec = cuts.sort/100
# An empty vector to hold the current row that we will build.
Elements = c()
# The starting point for each cut.
# The first cut starts at 1. Then resets this to its value.
ElementStart = 1
# Create each element.
for(Cut in cuts.dec){
Elements = c(Elements, (ElementStart-Cut))
ElementStart = Cut
}
# Append the last element to get the full row.
# This is from the last (smallest) cut value to 0.
# (This vector can be multiplied by any number to get that number as the row sum.)
Elements = c(Elements, cuts.dec[3])
# Add the row to the matrix.
Mx = rbind(Mx, Elements)
rownames(Mx) = NULL
}
# Print the matrix.
print(Mx)
# Check that all 5 rows sum to 1.
table(apply(Mx, 1, sum))
Ausgang:
> # Print the matrix.
> print(Mx)
[,1] [,2] [,3] [,4]
[1,] 0.38 0.36 0.16 0.10
[2,] 0.41 0.15 0.03 0.41
[3,] 0.08 0.50 0.35 0.07
[4,] 0.17 0.15 0.06 0.62
[5,] 0.07 0.09 0.23 0.61
>
> # Check that all 5 rows sum to 1.
> table(apply(Mx, 1, sum))
1
5