tag:blogger.com,1999:blog-5204092591876211047.post5146883320756010750..comments2023-03-23T07:34:12.473-04:00Comments on Advanced NFL Stats Community: Adjusting Strength of ScheduleUnknownnoreply@blogger.comBlogger5125tag:blogger.com,1999:blog-5204092591876211047.post-8115886629945380322011-11-19T14:58:46.795-05:002011-11-19T14:58:46.795-05:00Oakland is "RAI".Oakland is "RAI".Michael Beuoyhttps://www.blogger.com/profile/03960600491528993233noreply@blogger.comtag:blogger.com,1999:blog-5204092591876211047.post-45231492039940498662011-11-18T19:03:32.778-05:002011-11-18T19:03:32.778-05:00I think you forgot Oakland...I think you forgot Oakland...Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-5204092591876211047.post-7690878162954285342011-11-14T10:23:35.311-05:002011-11-14T10:23:35.311-05:00Thanks Jim. I'm still thinking through your m...Thanks Jim. I'm still thinking through your methodology, but I think it may be equivalent to mine, if you replace the Log5 function with the identity function. It is interesting how many disparate ways there are to approach this problem. Another approach I've seen is a variant of Google's PageRank algorithm. Much in the same way that Google uses inbound links to a webpage as a "vote" for a good webpage, the method treats Team A losing to Team B as Team A "voting" for Team B, where Team A's vote counts for more if other teams have lost to (i.e. voted) for it.<br /><br />Andrew - Thanks. I'll take a look.Michael Beuoyhttps://www.blogger.com/profile/03960600491528993233noreply@blogger.comtag:blogger.com,1999:blog-5204092591876211047.post-19943078398678525172011-11-13T14:28:04.688-05:002011-11-13T14:28:04.688-05:00Peter Mucha at UNC has done some interesting work ...Peter Mucha at UNC has done some interesting work on <a href="http://rankings.amath.unc.edu/old/manuscripts.htm" rel="nofollow">adjacency graphs and strength of schedule</a>; see also <a href="http://rwrankings.blogspot.com/" rel="nofollow">his updated college pages</a>Andrew Folandhttp://nuclearmangos.blogspot.comnoreply@blogger.comtag:blogger.com,1999:blog-5204092591876211047.post-90827210766662781612011-11-12T16:33:21.809-05:002011-11-12T16:33:21.809-05:00That's interesting, thanks.
I use an array fo...That's interesting, thanks.<br /><br />I use an array for SOS adjustments, though a bit different than yours at google.docs, 32x17, using iteration. Very simple. No matrix math. It basically works for any stat, to "adjust for opponent strength, [by] adjust[ing] each team efficiency stat according to the average opponents’ corresponding stat."<br /><br />There are 32 row for teams (Ariz, Atl, etc.) and 17 columns for the weeks of the season (plus more columns for playoff weeks if wanted). Each entry in a row has a number for the opposing team of that week. The array is set up at the start of the season. Eack week, as game results come in, the spreadsheet fills in the numbers on the corresponding column. Read across the values in any row to date, take the average, and you have the given team's "average opponent strength" for whatever stat one is looking at. Use that to iterate.<br /><br />As the most basic example take W-L% adjusted by SOS. When entering each week's game scores the spreadsheet tallies each team's W-L%. A second value for each team called "iterated WL%" (I-WL%(0), "0" for the intial iteration) is initially set to equal this, and is transferred into the array in all the appropriate spots. The result is that the row for each team includes the WL% for each of its opponents to date. Average the values, you have each team's average level of opposition by WL%. As simple as can be.<br /><br />Now the spreadsheet figures each team's "true strength" WL%, as adjusted by its opponents' average WL%, using the Log5 formula. (For instance, if a team has a 60% WL% in games versus opponents with a 55% record, its recalculated WL% becomes approximately 65%.) <br /><br />This adjusted WL% becomes its new iterated WL%, I-WL%(1). This number for each team now jumps into all the columns in the array, replacing the I-WL%(0) numbers, filling it with revised values. Rinse and repeat.<br /><br />Each team's numbers will differ between iterations, I-WL%(0), (1), (2), etc., but with the differences getting smaller. When the numbers stabilize, there you are. It usually takes about a dozen iterations. <br /><br />I set up a page with the array doing this at the beginning of the season, one can do it as soon as the league schedule is known. Once the page is set it can be used as a template to calculate SOS adjustments for practically any stat (with tweaking as the particular stat may require -- for instance replacing Log5 with whatever function is more appropriate). Just enter whatever the game result was for the stat, everything else is automatic. It can also calculate "future" SOS for the unplayed part of the season. There can be any number of these for different stats, they can interact, feed into a master stat page ... do all the things that can happen via a spreadsheet.<br /><br />There's a video on the PFR.com blog about how they calclulate SOS adjustments. They seem to do it in a way entirely different from Brian, you, me, I barely grasped it. It looks like there really are a lot of ways to crack a nut.Jim Glassnoreply@blogger.com