Genera N enteros aleatorios que sumn M en R

Me gustaría generar N enteros positivos aleatorios que sumn M Me gustaría que los enteros positivos aleatorios se seleccionen en una distribución bastante normal cuya media sea M/N , con una pequeña desviación estándar (¿es posible establecer esto como una restricción?).

Finalmente, ¿cómo generalizarías la respuesta para generar N números aleatorios positivos (no solo enteros)?

Encontré otras preguntas relevantes, pero no pude determinar cómo aplicar sus respuestas a este contexto: https://stats.stackexchange.com/questions/59096/generate-three-random-numbers-that-sum-to-1- en-r

Genera 3 números aleatorios que sumn 1 en R

R – distribución normal aproximada aleatoria de enteros con total predefinido

    Normalizar.

     rand_vect < - function(N, M, sd = 1, pos.only = TRUE) { vec <- rnorm(N, M/N, sd) if (abs(sum(vec)) < 0.01) vec <- vec + 1 vec <- round(vec / sum(vec) * M) deviation <- M - sum(vec) for (. in seq_len(abs(deviation))) { vec[i] <- vec[i <- sample(N, 1)] + sign(deviation) } if (pos.only) while (any(vec < 0)) { negs <- vec < 0 pos <- vec > 0 vec[negs][i] < - vec[negs][i <- sample(sum(negs), 1)] + 1 vec[pos][i] <- vec[pos ][i <- sample(sum(pos ), 1)] - 1 } vec } 

    Para una versión continua, simplemente use:

     rand_vect_cont < - function(N, M, sd = 1) { vec <- rnorm(N, M/N, sd) vec / sum(vec) * M } 

    Ejemplos

     rand_vect(3, 50) # [1] 17 16 17 rand_vect(10, 10, pos.only = FALSE) # [1] 0 2 3 2 0 0 -1 2 1 1 rand_vect(10, 5, pos.only = TRUE) # [1] 0 0 0 0 2 0 0 1 2 0 rand_vect_cont(3, 10) # [1] 2.832636 3.722558 3.444806 rand_vect(10, -1, pos.only = FALSE) # [1] -1 -1 1 -2 2 1 1 0 -1 -1 

    Acaba de idear un algoritmo para generar N números aleatorios mayores o iguales a k cuya sum es S, de una manera uniformemente distribuida. ¡Espero que sea útil aquí!

    Primero, genera N-1 números aleatorios entre ky S-k (N-1), inclusive. Ordenarlos en orden descendente. Luego, para todo x i , con i < = N-2, aplique x ' i = x i – x i + 1 + k, y x’ N-1 = x N-1 (use dos búferes). El número N es solo S menos la sum de todas las cantidades obtenidas. Esto tiene la ventaja de dar la misma probabilidad para todas las combinaciones posibles. Si quieres enteros positivos, k = 0 (¿o tal vez 1?). Si quiere reales, use el mismo método con un RNG continuo. Si sus números van a ser enteros, es posible que le importe si pueden o no ser k. ¡Los mejores deseos!

    Explicación: sacando uno de los números, todas las combinaciones de valores que permiten un número Nth válido forman un simplex cuando se representa en el espacio (N-1), que se encuentra en un vértice de un (N-1) -cubo ( el (N-1) -cubo descrito por el rango de valores aleatorios). Después de generarlos, tenemos que asignar todos los puntos en el N-cubo a los puntos en el símplex. Para ese propósito, he usado un método de triangulación que involucra todas las permutaciones de coordenadas posibles en orden descendente. Al ordenar los valores, estamos mapeando todos (N-1)! simplices a solo uno de ellos. También tenemos que traducir y escalar el vector de números para que todas las coordenadas estén en [0, 1], restando k y dividiendo el resultado por S – kN. Vamos a nombrar las nuevas coordenadas y i .

    Luego aplicamos la transformación multiplicando la matriz inversa de la base original, algo como esto:

      / 1 1 1 \ / 1 -1 0 \ B = | 0 1 1 |, B^-1 = | 0 1 -1 |, Y' = B^-1 Y \ 0 0 1 / \ 0 0 1 / 

    Lo que da y ‘ i = y i – y i + 1 . Cuando reescamos las coordenadas, obtenemos: x ‘ i = y’ i (S – kN) + k = y i (S – kN) – y i + 1 (S – kN) + k = (x i – k) – (x i + 1 – k) + k = x i – x i + 1 + k, de ahí la fórmula anterior. Esto se aplica a todos los elementos, excepto el último.

    Finalmente, debemos tener en cuenta la distorsión que introduce esta transformación en la distribución de probabilidad. En realidad, y por favor corrígeme si estoy equivocado, la transformación aplicada al primer símplex para obtener el segundo no debería alterar la distribución de probabilidad. Aquí está la prueba.

    El aumento de probabilidad en cualquier punto es el aumento en el volumen de una región local alrededor de ese punto, ya que el tamaño de la región tiende a cero, dividido por el aumento de volumen total de sílex. En este caso, los dos volúmenes son iguales (solo tome los determinantes de los vectores de base). La distribución de probabilidad será la misma si el aumento lineal del volumen de la región es siempre igual a 1. Podemos calcularlo como el determinante de la matriz de transposición de la derivada de un vector transformado V ‘= B -1 V con respecto a V , que, por supuesto, es B -1 .

    El cálculo de este determinante es bastante sencillo, y da 1, lo que significa que los puntos no están distorsionados de ninguna manera que haga que algunos de ellos sean más propensos a aparecer que otros.