¿Estamos solos? Las probabilidades reales de encontrarnos con extraterrestres… | por James Gearheart | Sep, 2024
**********************************;
**********************************;
/* Establezca la semilla aleatoria para la reproducibilidad */
datos _nulos_;
llamar a streaminit(1234);
correr;

/* Número de simulaciones */
%let num_simulaciones = 100000;

/* Número de civilizaciones a generar */
%let num_civilizaciones = 2364;

/* Radio galáctico y altura en años luz */
%let radio_galactico = 50000;
%let altura_galactica = 1300;

/* Posición de la Tierra (se supone que está a 3/4 del radio galáctico) */
%let posición_tierra_x = &radio_galáctico * 3 / 4;
%let posición_tierra_y = 0;
%let posición_tierra_z = 0;

/* Crear un conjunto de datos para almacenar las posiciones de la civilización */
datos civilización_posiciones;
longitud Civilización $10.;
entrada Civilización $ Posición_X Posición_Y Posición_Z;
líneas de datos;
Tierra &posición_tierra_x &posición_tierra_y &posición_tierra_z
;
correr;

/* Generar posiciones aleatorias para otras civilizaciones */
datos civilización_posiciones;
establecer civilizacion_posiciones;
¿hago i = 1 para &num_civilizaciones;
Posición_X = rand(“Uniforme”) * &radio_galáctico;
Posición_Y = rand(“Uniforme”) * 2 * &altura_galáctica – &altura_galáctica;
Posición_Z = rand(“Uniforme”) * 2 * &altura_galáctica – &altura_galáctica;
Civilización = “Civilización ” || strip(put(i, 8.));
producción;
fin;
soltar i;
correr;

/* Calcular la distancia entre las civilizaciones y la Tierra */
datos civilización_distancias;
establecer civilizacion_posiciones;
Distancia = sqrt((Posición_X – &posición_tierra_x)**2 + (Posición_Y – &posición_tierra_y)**2 + (Posición_Z – &posición_tierra_z)**2);
correr;

/* Calcular la distancia mínima a la Tierra para cada civilización */
procedimiento sql;
crear tabla civilization_min_distance como
Seleccione Civilización, Distancia como Min_Distance
de distancias de la civilización
ordenar por Distancia;
abandonar;

/* Calcular la probabilidad de encontrar civilizaciones en función de la distancia */
datos probabilidad_encuentro;
establecer civilización_min_distance;
Probabilidad = 1 / (1 + Min_Distancia);
correr;

/* Calcular la probabilidad media para cada banda de distancia */
procedimiento sql;
crear tabla probabilidad_promedio como
seleccionar caso
cuando Min_Distance <= 1000 entonces 'Cerrar'
cuando Min_Distance > 1000 y Min_Distance <= 3000 entonces 'Mediano'
cuando Min_Distance > 3000 entonces ‘Lejos’
termina como Distance_Band,
avg(Probabilidad) como Probabilidad_Promedio
de probabilidad_encuentro
agrupar por caso
cuando Min_Distance <= 1000 entonces 'Cerrar'
cuando Min_Distance > 1000 y Min_Distance <= 3000 entonces 'Mediano'
cuando Min_Distance > 3000 entonces ‘Lejos’
fin;
abandonar;

/*Imprime el resultado*/
proc imprimir datos=probabilidad_promedio;
correr;

/* Seleccione la civilización más cercana a la Tierra y su probabilidad asociada */
procedimiento sql;
crear la tabla nearest_civilization como
Seleccione Civilización, Distancia mínima, Probabilidad
de probabilidad_encuentro
donde Min_Distancia = (seleccione min(Min_Distancia) de probabilidad_encuentro);
abandonar;

/*Imprime el resultado*/
proc print data=civilización_más_cercana;
correr;

Análisis bayesiano de la probabilidad de encontrarse con extraterrestres en el pasado o en el futuro

/* Establecer semilla para reproducibilidad */
%let num_iteraciones = 100;

/* Crear conjunto de datos de análisis bayesiano */
análisis bayesiano de datos;
llamar a streaminit(123);

/* Definir variables para probabilidades posteriores */
matriz posterior_past[&num_iterations];
matriz posterior_futuro[&num_iterations];

¿hace i = 1 &num_iteraciones;
/* Muestras de probabilidades y posibilidades previas para encuentros pasados ​​*/
prior_past = rand(“Uniforme”, 0.0001, 0.01); /* P(Encuentro pasado) */
probabilidad_de_encuentro_pasado = rand(“Uniforme”, 0.001, 0.1); /* P(Sin contacto | Encuentro pasado) */
probabilidad_de_no_encuentro_pasado = rand(“Uniforme”, 0.8, 0.99); /* P(Sin contacto | Sin encuentro) */

/* Calcular la probabilidad posterior de un encuentro pasado utilizando el teorema de Bayes */
numerador_pasado = pasado_anterior * probabilidad_encuentro_pasado;
denominador_pasado = numerador_pasado + (1 – anterior_pasado) * probabilidad_de_no_encuentro_pasado;
pasado posterior[i] = numerador_pasado / denominador_pasado;

/* Muestras de probabilidades previas y posibilidades de encuentros futuros */
prior_future = rand(“Uniforme”, 0.001, 0.05); /* P(Encuentro futuro) */
probabilidad_de_encuentro_futuro = rand(“Uniforme”, 0.01, 0.1); /* P(Sin contacto | Encuentro futuro) */
probabilidad_de_no_encuentro_futuro = rand(“Uniforme”, 0.8, 0.99); /* P(Sin contacto | Sin encuentro) */

/* Calcular la probabilidad posterior de un encuentro futuro utilizando el teorema de Bayes */
numerador_futuro = futuro_anterior * probabilidad_futuro_encuentro;
denominador_futuro = numerador_futuro + (1 – futuro_anterior) * probabilidad_de_no_encuentro_futuro;
futuro_posterior[i] = numerador_futuro / denominador_futuro;
fin;

/* Mostrar los resultados */
¿hace i = 1 &num_iteraciones;
valor_pasado_posterior = pasado_posterior[i];
valor_futuro_posterior = futuro_posterior[i];
producción;
fin;
mantener valor_pasado_posterior valor_futuro_posterior;
correr;

/* Estadísticas resumidas de las probabilidades posteriores */
proc significa datos=análisis bayesiano media std min max;
var valor_pasado_posterior valor_futuro_posterior;
correr;

/* Histogramas de distribución para las probabilidades posteriores */
proc sgplot datos=análisis_bayesiano;
histograma valor_posterior_pasado / transparencia=0.5 fillattrs=(color=azul) ancho_bin=0.00001;
título “Distribución de probabilidades posteriores para encuentros pasados”;
correr;

proc sgplot datos=análisis_bayesiano;
histograma valor_futuro_posterior / transparencia=0.5 fillattrs=(color=verde) ancho_bin=0.0001;
título “Distribución de probabilidades posteriores para encuentros futuros”;
correr;