The basic process is public, but the exact formulas are proprietary. You can get very close estimations, look at some of jeverett's posts in other threads to find some that basically are identical, but those are reverse engineered by looking at data. It is reasonably straightforward, but a lot of other random stuff goes into it like figuring out propagators, dropping outlier rounds, determining the SSA, using that to determine the points per stroke, and using that to determine round ratings.
I have threads floating around with the (known) pieces of the PDGA ratings system in them, yeah. The full process has quite a few steps to it, but here they are in brief:
1). Determine who is a propagator, and the 'true' ratings of each propagator This is actually tricky to do externally. Propagators are players who have *at least* 8 prior rated rounds. These now nicely show up in bold print on event reports. However players without current PDGA memberships may still be propagators, a determination that cannot be done externally. Also, I believe that any player who is subject to the "888" ratings manipulation penalty actually is treated as having their 'full' rating for purposes of these calculations, another determination that cannot really be effectively done externally.
2). Compute the SSA, using linear regression. By comparing the (initial) player ratings of all with how they scored for the round (player rating on the x axis, round score on the y), compute the best-fit line. The point where this line hits 1000 rating points is the 'scratch score average' (SSA).
Note: the assumption that the relationship between player rating and round score is linear is sometimes questionable, however this is confirmed as the method the PDGA uses.
3). Based on the determined SSA, calculate the rating-interval-per-throw, using the PDGA 'compression' formulas. I previously reverse-engineered these compression formulas using linear regression. These formulas are accurate to within 0.1% of the 'true' PDGA formulas:
For SSA's above 50.3289725:
Rating Increment = -0.225067 * SSA + 21.3858
For SSA's below 50.3289725:
Rating Increment = -0.487095 * SSA + 34.5734
Note: the assumption that the PDGA rating increment should be dependent exclusively on the SSA for the round is questionable. I've written a post about this topic elsewhere.
4). Compute round ratings. Here is the formula to do that, using the rating increment from step 3:
Round rating = (SSA - round_score) * rating_increment + 1000
5). Drop outliers. The PDGA method is a two-pass method, and excludes any propagator who's round initially rates in >60 points below their rating. So, if a 1000-rated player throws a round that rates in at a 930, that round gets dropped from step 2 above, and the above steps are calculated all over again (once all outliers have been removed).
Note: the assumption that, once outliers have been removed, that all propagators' rounds are equally-meaningful is questionable, however this is the method the PDGA uses.
6). Using round ratings, periodically update player ratings. In the PDGA method, all rounds within one calendar year of the most recent round are included (initially) in a players' rating. If this is fewer than 8 total rounds, older rounds are included until at least 8 rounds are found. Of these rounds, those outside of (I believe it's just one) a standard deviation are not included in a players' rating. Of included rounds, the most-recent 25% are double-weighted.
*whew* Ok, that briefly covers every step. Make sense?