Gryphon_

Mathematics Contributor
  • Content count

    935
  • Joined

  • Last visited

About Gryphon_

  • Rank
    Tests New Guns on Allies

Profile Information

  • Gender
    Male
  • Location
    Los Angeles
  • Server
    NA

Recent Profile Visitors

3,245 profile views
  1. But....I always thought the official forums were for serial posters with nothing to say....?
  2. Interesting. I've seen my winrate do same; I got to the magic '54%' overall, then along comes 9.20 and it goes into reverse - hard. Now, every night I'm struggling to attain high 40's WR. No matter what I play, even when I should have carried, I rarely do anymore. I just cant figure it out in terms of 'what changed'. The only clue I have is that in early days of the new MM (9.18) I was cleaning up in tier 7 with the T71 and in tier 9 with the Lwt, but now the MM is far less kind - my T71 is hardly ever top tier now, whereas back in 9.18 is was almost all the time(!).
  3. Please bear in mind that if you update the values every day, all the other sites out there using your values will be constantly updating, as not all do it automatically. Just because you have the server power to update every day doesnt mean thats a good use of your resources - the values of any tank shouldn't change by a noticeable amount in a day.... It would be far better to update every month, and do the averages every 6. More frequent changes than that will be a pain for all the sites and modders to keep up with.
  4. Are we playing the same tank? I have a BIA crew and I'm getting sub-2 sec aim time and a dispersion of 0.3 - none better at tier 9. If you can't hit stuff at 300m with this tank, you don't have any better options. But - it has to be said that this tank is the medium of choice for those who normally play lights. It is not the medium of choice for those who play heavies (T-54, 430, etc).
  5. Its only a POS if you try to brawl with it. Put 300m between you and the other guys and its very good indeed. Of course, discussion is about the elite tank...dont play it when not elite, especially not without the L7 gun
  6. Its still bad. Amazing they can release crap like this and creep it up ever so slowly (and too slowly) then in same timeframe drop Defenders, Scorpions, and other ridiculously OP prems into the game.
  7. And you can take the vstab off if playing the 105, add vents, +12m VR, boss with a 390 punch. I've also noticed that for a tier ten light in CW, a 300 pen HEAT round > 248 pen AP round (T-100LT) - especially at long range.
  8. According to some people who've obviously never played it. The Sheridans advantage is VR, but is poor on camo, so it has no useful advantage unless passive
  9. On wotlabs, most sites, and some mods, yes. However, the xvm team is close to having an automated way of producing per-tank values so you will see a slightly different WN8 score in XVM (mine is 4 different overall)
  10. 50 was what the original WN8 team came up with. I think while WN9 was being researched we found that raising it didn't really make any difference. The big change that sirmax is making is to raise the account threshold to 10,000 battles (was 1000). THAT makes a big difference, if you have a huge dataset.
  11. Update: I had some thoughts on how to update the averages the 'hard' way. I figured it out and the following R script works. #apply filters as needed userTankStats <- dataMaster[dataMaster$battles > 50,] userTankStats$damage_dealt <- as.double(userTankStats$damage_dealt) userTankStats <- userTankStats[,c("userid", "compDescr","title", "type", "tier", "countryid", "battles", "victories","damage_dealt","frags", "spotted","defence_points")] userTankStats$userid <- as.factor(userTankStats$userid) any(is.na(userTankStats)) # number of battles in dataset sum(userTankStats$battles) #calc actuals userTankStats$aFRAG <- userTankStats$frags/userTankStats$battles userTankStats$aDAMAGE <- userTankStats$damage_dealt/userTankStats$battles userTankStats$aSPOT <- userTankStats$spotted/userTankStats$battles userTankStats$aDEF <- userTankStats$defence_points/userTankStats$battles userTankStats$aWIN <- 100*userTankStats$victories/userTankStats$battles any(is.na(userTankStats)) #load average expected values from wnefficiency.net - currently version 31 wnefficiencyURL <- "http://www.wnefficiency.net/exp/expected_tank_values_31.csv" expectedValues <- read.csv(wnefficiencyURL) names(expectedValues) <- c("type","tier", "eFRAG", "eDAMAGE","eSPOT", "eDEF", "eWIN") head(expectedValues) any(is.na(expectedValues)) # add the expected values data to the user tanks data require(dplyr) userTankStats <- inner_join(x=userTankStats, y=expectedValues, by = c("type","tier") ) # fix chars that upset file naming userTankStats$title <- chartr("*/", "_-", userTankStats$title) any(is.na(userTankStats)) # calculate the user rSTATS userTankStats$rFRAG <- userTankStats$aFRAG/userTankStats$eFRAG userTankStats$rDAMAGE <- userTankStats$aDAMAGE/userTankStats$eDAMAGE userTankStats$rSPOT <- userTankStats$aSPOT/userTankStats$eSPOT userTankStats$rDEF <- userTankStats$aDEF/userTankStats$eDEF userTankStats$rWIN <- userTankStats$aWIN/userTankStats$eWIN userTankStats$rFRAGproduct <- userTankStats$rFRAG * userTankStats$battles userTankStats$rDAMAGEproduct <- userTankStats$rDAMAGE * userTankStats$battles userTankStats$rSPOTproduct <- userTankStats$rSPOT * userTankStats$battles userTankStats$rDEFproduct <- userTankStats$rDEF * userTankStats$battles userTankStats$rWINproduct <- userTankStats$rWIN * userTankStats$battles any(is.na(userTankStats)) # calculate the user rSTATc's userTankStats$rWINc <- pmax(0,(userTankStats$rWIN - 0.71)/(1 - 0.71)) userTankStats$rDAMAGEc <- pmax(0,(userTankStats$rDAMAGE - 0.22)/(1 - 0.22)) userTankStats$rFRAGc <- pmax(0,pmin(userTankStats$rDAMAGEc + 0.2,((userTankStats$rFRAG - 0.12)/(1 - 0.12)))) userTankStats$rSPOTc <- pmax(0,pmin(userTankStats$rDAMAGEc + 0.1,((userTankStats$rSPOT - 0.38)/(1 - 0.38)))) userTankStats$rDEFc <- pmax(0,pmin(userTankStats$rDAMAGEc + 0.1,((userTankStats$rDEF - 0.10)/(1 - 0.10)))) userTankStats$rWINcproduct <- userTankStats$rWINc * userTankStats$battles userTankStats$rDAMAGEcproduct <- userTankStats$rDAMAGEc * userTankStats$battles userTankStats$rFRAGcproduct <- userTankStats$rFRAGc * userTankStats$battles userTankStats$rSPOTcproduct <- userTankStats$rSPOTc * userTankStats$battles userTankStats$rDEFcproduct <- userTankStats$rDEFc * userTankStats$battles any(is.na(userTankStats)) # calculate the user WN8 per tank userTankStats$WN8 <- with(userTankStats, 980*rDAMAGEc + 210*rDAMAGEc*rFRAGc + 155*rFRAGc*rSPOTc + 75*rDEFc*rFRAGc + 145*pmin(1.8,rWINc)) userTankStats$WN8product <- userTankStats$battles * userTankStats$WN8 any(is.na(userTankStats)) # filter out all tanks where WN8 is below median WN8 for every users' tanks require(dplyr) median.userTankStatsWN8 <- summarize(group_by(userTankStats,userid), median_WN8 = median(WN8, na.rm=TRUE)) userTankStatsFiltered <- inner_join(x=userTankStats, y=median.userTankStatsWN8, by = "userid") userTankStatsFiltered <- userTankStatsFiltered[userTankStatsFiltered$WN8 >= userTankStatsFiltered$median_WN8,] nrow(userTankStatsFiltered) any(is.na(userTankStatsFiltered)) rm(median.userTankStatsWN8) #calculate the user account WN8, rSTATs, and rSTATSc require(dplyr) userAccountStats <- summarize(group_by(userTankStatsFiltered, userid), WN8product = sum(WN8product), rWINproduct = sum(rWINproduct), rDAMAGEproduct = sum(rDAMAGEproduct), rFRAGproduct = sum(rFRAGproduct), rSPOTproduct = sum(rSPOTproduct), rDEFproduct = sum(rDEFproduct), rWINcproduct = sum(rWINcproduct), rDAMAGEcproduct = sum(rDAMAGEcproduct), rFRAGcproduct = sum(rFRAGcproduct), rSPOTcproduct = sum(rSPOTcproduct), rDEFcproduct = sum(rDEFcproduct), battles = sum(battles)) userAccountStats$user_WN8 <- userAccountStats$WN8product / userAccountStats$battles userAccountStats$user_rWIN <- userAccountStats$rWINproduct / userAccountStats$battles userAccountStats$user_rDAMAGE <- userAccountStats$rDAMAGEproduct / userAccountStats$battles userAccountStats$user_rFRAG <- userAccountStats$rFRAGproduct / userAccountStats$battles userAccountStats$user_rSPOT <- userAccountStats$rSPOTproduct / userAccountStats$battles userAccountStats$user_rDEF <- userAccountStats$rDEFproduct / userAccountStats$battles userAccountStats$user_rWINc <- userAccountStats$rWINcproduct / userAccountStats$battles userAccountStats$user_rDAMAGEc <- userAccountStats$rDAMAGEcproduct / userAccountStats$battles userAccountStats$user_rFRAGc <- userAccountStats$rFRAGcproduct / userAccountStats$battles userAccountStats$user_rSPOTc <- userAccountStats$rSPOTcproduct / userAccountStats$battles userAccountStats$user_rDEFc <- userAccountStats$rDEFcproduct / userAccountStats$battles userAccountStats <- userAccountStats[,c("userid", "user_WN8", "user_rWIN", "user_rDAMAGE", "user_rFRAG", "user_rSPOT", "user_rDEF", "user_rWINc", "user_rDAMAGEc", "user_rFRAGc", "user_rSPOTc", "user_rDEFc")] any(is.na(userAccountStats)) #merge back require(dplyr) userTankStatsFiltered <- inner_join(x=userTankStatsFiltered, y=userAccountStats, by = c("userid")) any(is.na(userTankStatsFiltered)) # create table of compDescr and title as index for the loop require(dplyr) listOfTanks <- summarize(group_by(userTankStatsFiltered, tier, type ), users = n() ) any(is.na(listOfTanks)) # loop to do linear regression for each rSTAT vs user account rSTAT, derive corrected average expected values newExpectedValues <- expectedValues for (i in 1:10) { for (j in 1:5) {0 sample <- subset(x = userTankStatsFiltered, tier == i & type == j) if (nrow(sample) == 0){ next } rDAMAGEmodel <- lm(rDAMAGE ~ user_rDAMAGE, data = sample) rDAMAGEcorrection <- rDAMAGEmodel$coef[[1]] + rDAMAGEmodel$coef[[2]] eDAMAGE_new <- round(rDAMAGEcorrection * expectedValues$eDAMAGE[which(expectedValues$tier == i & expectedValues$type == j)], 2) newExpectedValues$eDAMAGE[which(newExpectedValues$tier == i & newExpectedValues$type == j)] <- eDAMAGE_new rFRAGmodel <- lm(rFRAG ~ user_rFRAG, data = sample) rFRAGcorrection <- rFRAGmodel$coef[[1]] + rFRAGmodel$coef[[2]] eFRAG_new <- round(rFRAGcorrection * expectedValues$eFRAG[which(expectedValues$tier == i & expectedValues$type == j)], 2) newExpectedValues$eFRAG[which(newExpectedValues$tier == i & newExpectedValues$type == j)] <- eFRAG_new rSPOTmodel <- lm(rSPOT ~ user_rSPOT, data = sample) rSPOTcorrection <- rSPOTmodel$coef[[1]] + rSPOTmodel$coef[[2]] eSPOT_new <- round(rSPOTcorrection * expectedValues$eSPOT[which(expectedValues$tier == i & expectedValues$type == j)], 2) newExpectedValues$eSPOT[which(newExpectedValues$tier == i & newExpectedValues$type == j)] <- eSPOT_new rDEFmodel <- lm(rDEF ~ user_rDEF, data = sample) rDEFcorrection <- rDEFmodel$coef[[1]] + rDEFmodel$coef[[2]] eDEF_new <- round(rDEFcorrection * expectedValues$eDEF[which(expectedValues$tier == i & expectedValues$type == j)], 2) newExpectedValues$eDEF[which(newExpectedValues$tier == i & newExpectedValues$type == j)] <- eDEF_new rWINmodel <- lm(rWIN ~ user_rWIN, data = sample) rWINcorrection <- rWINmodel$coef[[1]] + rWINmodel$coef[[2]] eWIN_new <- round(rWINcorrection * expectedValues$eWIN[which(expectedValues$tier == i & expectedValues$type == j)], 2) newExpectedValues$eWIN[which(newExpectedValues$tier == i & newExpectedValues$type == j)] <- eWIN_new } } any(is.na(newExpectedValues)) names(newExpectedValues) <- c("type","tier", "frag", "dmg","spot", "def", "win") #export new values date <- as.Date(Sys.Date(), "%m/%d/%Y" ) expected_value_filename <- paste("~/R/WN8 Averaged/averaged_expected_values_",date,".csv") write.csv(x=newExpectedValues,file=expected_value_filename ,row.names = FALSE)
  12. Okay, sounds like you have a process - good job. To update the averages there are two ways: Simple: For each type+tier, use your latest set of expected values (with battle counts) and do a weighted average for each expected value. That will work for all types and tiers that exist now (the v31 table has estimated values for things that don't exist yet, like tier 1 heavies, so write the script so that they just go through unchanged) Harder: apply the v31 values to the dataset, run the script as normal, then when you get to the calculation of corrections, generate the linear models using every type+tier pair vs the rSTAT instead of the tankid vs the rSTAT. That will give you a correction to the averaged value same as normal. (I have never done this as we had no plans to update the values. There may be unforeseen problems with this method)
  13. Agree. I sold it right after the nerf.
  14. Great job, and some very nice data. I think there are two criteria: For an account-level rating (which is what WN8 is) the Adjusted R Squared of the u_wn8 vs u_winc. v31-1.def = 0.915 <- baseline v31-1.new= 0.919 <- best v31-2.def = 0.919 <- equal best v31-2.new= 0.918 <- a step back Ease of calculation / sustainability. We stopped doing per-tank values because its a lot of work and we found the averages were almost as good as the per tank values. So the extra work wasn't justified as we couldn't automate it all. So how easy is it for you to generate the values automatically? My guess: v31-1.def = zero work <- baseline v31-1.new= one automated run <- best v31-2.def = one automated run plus manual inspection and tuning (?) <- distant second if manual inspection and tweaking needed v31-2.new= one automated run plus manual inspection and tuning, followed by another automated run <- distant third On balance, you get all the gains and least work by going with v31.1.new - run the data against the averages to create per tank values. Run that once a month and you'll keep WN8 running as good as it can be. I suggest creating new averages from your battle weighted values about twice a year, so you have a steadily improving baseline, and you are set.