Soy consciente de que la simulación de Monte-Carlo se utiliza para hacer suposiciones precisas mediante la introducción de la aleatoriedad. Pero, ¿puede utilizarse para sintetizar o crear un conjunto de datos? Si es así, ¿puede alguien compartir un ejemplo?
Respuestas
¿Demasiados anuncios?SI
Daré un ejemplo en R.
set.seed(2022)
# Set sample size
#
N <- 100
# Declare some regression feature
#
x <- seq(1, 100, 1)
# Define the outcome variable, using a
# random normal error term (this is
# the Monte Carlo part)
#
y <- 1 - x + rnorm(N)
Ahora tienes un conjunto de datos sintéticos y puedes ejecutar una regresión, por ejemplo.
Un ejemplo de que esto puede ser útil es si se desarrolla una nueva prueba de hipótesis para un coeficiente de regresión y se quiere ver cómo se comporta cuando la hipótesis nula es verdadera. De este modo, se realiza un bucle a través de $1000$ simulaciones de regresión como ésta y pruebas de hipótesis cada vez, recogiendo el valor p de cada prueba de hipótesis.
set.seed(2022)
N <- 100
R <- 1000
ps <- rep(NA, R)
x <- seq(1, N, 1)
for (i in 1:R){
y <- 1 + rnorm(N) # zero slope coefficient
L <- lm(y ~ x)
ps[i] <- summary(L)$coef[2, 4] # extract p-value of t-testing slope
}
plot(
ps,
ecdf(ps)(ps),
xlab = "p-value",
ylab = "quantile"
)
abline(0, 1)
Si usted fuera el inventor de la prueba t utilizada aquí, vería que su prueba da valores p uniformes bajo la hipótesis nula de pendiente cero (exactamente el comportamiento deseado).
La biblioteca Probabilidad de TensorFlow está diseñado para este propósito. De hecho, el primer ejemplo que se encuentra en el sitio web consiste en la creación de datos sintéticos que luego se utilizan para un ejemplo de regresión:
import tensorflow as tf
import tensorflow_probability as tfp
# Pretend to load synthetic data set.
features = tfp.distributions.Normal(loc=0., scale=1.).sample(int(100e3))
labels = tfp.distributions.Bernoulli(logits=1.618 * features).sample()
# Specify model.
model = tfp.glm.Bernoulli()
# Fit model given data.
coeffs, linear_response, is_converged, num_iter = tfp.glm.fit(
model_matrix=features[:, tf.newaxis],
response=tf.cast(labels, dtype=tf.float32),
model=model)
# ==> coeffs is approximately [1.618] (We're golden!)