**********************************;
/* Set the random seed for reproducibility */
knowledge _null_;
name streaminit(1234);
run;
/* Variety of simulations */
%let num_simulations = 100000;
/* Variety of civilizations to generate */
%let num_civilizations = 2364;
/* Galactic radius and top in gentle years */
%let galactic_radius = 50000;
%let galactic_height = 1300;
/* Earth’s place (assumed to be at 3/4 of the galactic radius) */
%let earth_position_x = &galactic_radius * 3 / 4;
%let earth_position_y = 0;
%let earth_position_z = 0;
/* Create a dataset to retailer civilization positions */
knowledge civilization_positions;
size Civilization $10.;
enter Civilization $ Position_X Position_Y Position_Z;
datalines;
Earth &earth_position_x &earth_position_y &earth_position_z
;
run;
/* Generate random positions for different civilizations */
knowledge civilization_positions;
set civilization_positions;
do i = 1 to &num_civilizations;
Position_X = rand(“Uniform”) * &galactic_radius;
Position_Y = rand(“Uniform”) * 2 * &galactic_height – &galactic_height;
Position_Z = rand(“Uniform”) * 2 * &galactic_height – &galactic_height;
Civilization = “Civilization ” || strip(put(i, 8.));
output;
finish;
drop i;
run;
/* Calculate the space between civilizations and Earth */
knowledge civilization_distances;
set civilization_positions;
Distance = sqrt((Position_X – &earth_position_x)**2 + (Position_Y – &earth_position_y)**2 + (Position_Z – &earth_position_z)**2);
run;
/* Calculate the minimal distance to Earth for every civilization */
proc sql;
create desk civilization_min_distance as
choose Civilization, Distance as Min_Distance
from civilization_distances
order by Distance;
stop;
/* Calculate the chance of encountering civilizations based mostly on distance */
knowledge probability_encounter;
set civilization_min_distance;
Chance = 1 / (1 + Min_Distance);
run;
/* Calculate the typical chance for every distance band */
proc sql;
create desk average_probability as
choose case
when Min_Distance <= 1000 then ‘Shut’
when Min_Distance > 1000 and Min_Distance <= 3000 then ‘Medium’
when Min_Distance > 3000 then ‘Far’
finish as Distance_Band,
avg(Chance) as Average_Probability
from probability_encounter
group by case
when Min_Distance <= 1000 then ‘Shut’
when Min_Distance > 1000 and Min_Distance <= 3000 then ‘Medium’
when Min_Distance > 3000 then ‘Far’
finish;
stop;
/* Print the outcome */
proc print knowledge=average_probability;
run;
/* Choose the closest civilization to Earth and its related chance */
proc sql;
create desk closest_civilization as
choose Civilization, Min_Distance, Chance
from probability_encounter
the place Min_Distance = (choose min(Min_Distance) from probability_encounter);
stop;
/* Print the outcome */
proc print knowledge=closest_civilization;
run;
/*Bayesian evaluation for chance of encountering aliens up to now or future*/
/* Set seed for reproducibility */
%let num_iterations = 100;
/* Create Bayesian evaluation dataset */
knowledge bayesian_analysis;
name streaminit(123);
/* Outline variables for posterior possibilities */
array posterior_past[&num_iterations];
array posterior_future[&num_iterations];
do i = 1 to &num_iterations;
/* Pattern prior possibilities and likelihoods for previous encounters */
prior_past = rand(“Uniform”, 0.0001, 0.01); /* P(Previous encounter) */
likelihood_past_encounter = rand(“Uniform”, 0.001, 0.1); /* P(No contact | Previous encounter) */
likelihood_no_encounter_past = rand(“Uniform”, 0.8, 0.99); /* P(No contact | No encounter) */
/* Calculate posterior chance for previous encounter utilizing Bayes’ Theorem */
numerator_past = prior_past * likelihood_past_encounter;
denominator_past = numerator_past + (1 – prior_past) * likelihood_no_encounter_past;
posterior_past[i] = numerator_past / denominator_past;
/* Pattern prior possibilities and likelihoods for future encounters */
prior_future = rand(“Uniform”, 0.001, 0.05); /* P(Future encounter) */
likelihood_future_encounter = rand(“Uniform”, 0.01, 0.1); /* P(No contact | Future encounter) */
likelihood_no_encounter_future = rand(“Uniform”, 0.8, 0.99); /* P(No contact | No encounter) */
/* Calculate posterior chance for future encounter utilizing Bayes’ Theorem */
numerator_future = prior_future * likelihood_future_encounter;
denominator_future = numerator_future + (1 – prior_future) * likelihood_no_encounter_future;
posterior_future[i] = numerator_future / denominator_future;
finish;
/* Output the outcomes */
do i = 1 to &num_iterations;
posterior_past_value = posterior_past[i];
posterior_future_value = posterior_future[i];
output;
finish;
maintain posterior_past_value posterior_future_value;
run;
/* Abstract statistics for the posterior possibilities */
proc means knowledge=bayesian_analysis imply std min max;
var posterior_past_value posterior_future_value;
run;
/* Distribution histograms for the posterior possibilities */
proc sgplot knowledge=bayesian_analysis;
histogram posterior_past_value / transparency=0.5 fillattrs=(colour=blue) binwidth=0.00001;
title “Distribution of Posterior Possibilities for Previous Encounters”;
run;
proc sgplot knowledge=bayesian_analysis;
histogram posterior_future_value / transparency=0.5 fillattrs=(colour=inexperienced) binwidth=0.0001;
title “Distribution of Posterior Possibilities for Future Encounters”;
run;