The problem with puzzles is that you keep it in your head for days, until you find an answer. Or at least some ideas about a possible answer. This is what happened to me a few weeks ago, when a colleague of mine asked me the following question : Consider points uniformly distributed on a sphere. What is the probability that the
points lie on a same hemisphere, for some hemisphere (there is no south or north here) ?

Analogously, what is the probability to see the points on the Earth, at the same time, from somewhere in the galaxy ? (even extremely far away, so we can see a complete hemisphere) I wanted to use Monte Carlo simulations to estimate that probability, for some
. But it was difficult. I mean, given
points on the sphere, in can you easily determine if they lie on a common hemisphere, or not ? I did try with distance, or angle, but I could not find a simple answer. So I tried a technique I did learn a few years ago : if you cannot do something in dimension 3, try first in dimension 2.
Again, I could not find a simple answer. But there is a simple technique.
- Draw
points on the unit sphere, which simply means generate
random variables
- Try to find
such that, after a rotation (with angle
) all the points lie in the upper part (the North hemisphere, for instance)
So the question here is simply : is
equal to ? Of course, from a computational point of view, it is slightly more complex, since this function is not differentiable.
n=5 Theta=runif(n)*2*pi top=Vectorize(function(theta) sum(sin(Theta+theta)>=0))
So a simple strategy can be to compute those values on a finite grid, and to check if, for some , all the points lie in the upper part
max(top(seq(0,2*pi,length=6001)))==n
Hence, with the following sample, all the points cannot be on a common hemisphere
set.seed(2) Theta=runif(5)*2*pi

while, for another sample of points, it was possible
set.seed(7) Theta=runif(5)*2*pi

With this simple code, we get get the probability, but only in dimension 2 (so far)
SIM=Vectorize(function(n) simul(n,1000)) plot(3:10,SIM(3:10))

In
dimension 3, it is still possible to use also a polar representation. Things are easier to generate, but also it is simple to consider rotations. And again, a simple algorithm can be derived,
But there is a simple technique.
- Draw
points on the unit sphere, which simply means generate
random variables
and
- Try to find
and
such that, after a rotation (with angles
and
) all the points lie in some given part (say
)
As mentioned by Dominique, using this technique, points are not uniformly distributed on the sphere. Instead we can use
- Draw
points on points from a trivaraite Gaussian distribution, and normalize it
- Get the polar coordinates, and try to find
and
such that, after a “rotation” (with angles
and
) all the points lie in some given part (say
)
So the question here is simply : is
(I am not sure about the set of angles for the rotations, so I tried a larger one, just in case). Again, it would be complex, or more complex than before, because we need here a joint grid. For instance
MZ=matrix(rnorm(n*3),n,3) d=apply(MZ,1,function(z) sqrt(sum(z^2))) X=MZ[,1]/d; Y=MZ[,2]/d; Z=MZ[,3]/d; Theta=acos(Z) Phi=acos(X/sqrt(X^2+Y^2))*(Y>=0)+(2*pi-acos(X/sqrt(X^2+Y^2)))*(Y<0) top=function(theta,phi) sum(sin(Theta+theta)*cos(Phi+phi)>=0) TOP=mapply(top,rep(seq(0,2*pi,length=1001),1001),rep(seq(-pi,pi,length=1001),each=1001)) max(TOP)==n

As we can see with the red curve, there might be some problems here. Because, (as mention in kmath327), this problem was solved in any dimension in Wendel (1962) with the following simple expression : in dimension , the probability that the
points (uniformly distributed on a sphere) lie on a same hemisphere is exactly
p=function(d,n) .5^(n-1) * sum(choose(n-1,0:(d-1)))
Note that Leonard Savage proved (a few years before) that
(which can be obtained easily actually). I do not see what’s wrong with my Monte Carlo simulations… and if anyone has a nice Monte Carlo strategy to get that probability, I’d be glad to hear it !
such that
. It can be seen as an invariance by rotation.
is Bessel modified function of order 1,
(some concentration parameter) and mu a direction.
, the maximum likelihood estimator for kappa is solution of


, where those functions are modified Bessel functions. Well, that estimator is biased, but it is possible to improve it (see
is the time (in hours) for the
th observation (the 


ode looks rather simple. But I am not very comfortable using codes that I do not completely understand. So I did my own. The first step was to get a graph similar to the one we have on the right, except that I prefer my own kernel based estimator. The idea is that instead of estimating the density on
, we estimate it on the sample
. Then we multiply by 3 to get the density only on
. For the bandwidth, I took the same as the one that we would have taken on 


A standard application when studying angles is wind direction. For instance, in Montréal, it is possible to find hourly observations, starting in 1974 (we just need a R robot to pick up the information, but I’ll tell more about that in another post, someday). Here, we have directly an angle. So we can use a code rather similar to the one used above to estimate the distribution of wind direction in Montréal.




to densities on the unit circle
. But similarly, it is possible to go from
to the unit sphere
. A nice application being global climate studies,
