2019 Holiday Exchange!
 
A New and Exciting Beginning
 
The End of an Era
  • posted a message on How much is too much?
    As a person who has a basically every Tier 1 deck, "too much" is more than 1-2 decks.

    A. You can only play one deck per tournament;
    B. Legacy tournaments are rare enough events (at least in my area) that you won't be able to practice enough with other decks. As other people have pointed out practice is paramount. Our playgroup's best player regularly beats us with a Tier 1 deck with his Tier 1.5 Junk deck. I think Enevoldsen's victory at GP Strasbourg with Death and Taxes is a good example of a Tier 1.25 deck being piloted to victory by an excellent player.
    C. It's fun to try other decks, and it's good to pilot them to understand what the opposition is trying to do, but this is what proxies are for;
    D. You do probably want 2 decks:
    i. as an extra deck for a play group;
    ii. to loan to a random friend;
    iii. to have alternate strategies given slight fluctuations in the metagame
    E. Decks need to be "maintained" to a certain degree (e.g. Goblins now requires 4 Cavern of Souls), the more decks you have the higher this maintenance is.
    F. You tie up a bunch of otherwise working capital that could be earning interest;
    G. Pick a deck that suits your style (this took me a while to figure out):
    i. Storm, Doomsday if you like solving puzzles;
    ii. Sharless BUG, Jund, Goblins, Lands, if you like grinding;
    iii. Sneak and Show, Elves, Merfolk, MUD, High Tide, if you like powerful straightforward strategies;
    iv. Maverick, RUG, Esper Stoneblade, UW Miracles, if you like lots of "play" to your decks.
    F. Pick a deck that fits the amount of time you have to practice; each deck has its ins and outs, but some are easier than others.
    H. If you play online, you probably want a copy of your preferred deck, which doubles your costs.
    Posted in: Legacy (Type 1.5)
  • posted a message on Format Defining Cards
    Your wish is my data crunching command:

    Here are the top 66% of cards played in top decks of SCG Legacy Series + WotC GPs since February of 2012

    Posted in: Legacy (Type 1.5)
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 2
    Quote from Talcos »

    but they certainly appeal to readers such as myself.

    I'm glad to hear there is at least some interest.

    Quote from palanthas »

    What is the relative value of the legendary type looking only at other blocks, i.e. those without a legendary theme?

    I reran the regression as requested:
    With Kawigama block: Legendary = +37% price
    Without Kawigama block: Legendary = +55% price

    Interpretation: All the crappy legends from Kawigama dilute the value of legendary as a game design tool to moderate the power level of a card.

    Quote from Rhadamanthus »

    æ ligature only to see a your/you're error in the very last sentence.

    I like my ligatures and Latin. Like you I also appreciate non-phonetic spelling.

    Quote from LSK »

    Where did you get the price data from?

    As part 1 states: www.TCGPlayer.com

    Quote from LSK »

    What software (and commands) did you use to analyze the data?


    R

    Quote from LSK »

    What commands did you use to analyze the data?

    It's pretty messy, but you asked:
    PRICES <- data.frame(read.csv("~/Favourites/Games/MTG/Writing/2_Pricing.Magic/data/Prices.csv"))
    PRICES <- subset(PRICES, SinglePrice > 0 )
    Commonality.Rating <- (1-PRICES$Rarity.Rating)
    PRICES <- cbind(PRICES,Commonality.Rating)
    PRICES[,"COLOR"] <- as.factor(PRICES[,"COLOR"])
    
    
    PRICESwoABU <- subset(PRICES, Set %ni% c("Limited Edition Alpha","Limited Edition Beta","Unlimited Edition"))
    pricesModel <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+log(as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN,data=PRICES)
    pricesModelwoABU <- lm(log(SinglePrice)~Rarity+Reprints+COCLOR+log(as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND)),data=PRICESwoABU)
    
    summary(pricesModel)
    summary(pricesModelwoABU)
    
    
    ##PRINT RUN
    printRunModel_base <- lm(log(SinglePrice)~log(PRINT_RUN),data=subset(PRICES,PRINT_RUN > 0))
    printRunModel <- lm(log(SinglePrice)~Rarity+log(PRINT_RUN),data=subset(PRICES,PRINT_RUN > 0))
    summary(printRunModel)
    tmp <- subset(PRICES,PRINT_RUN > 0,select=c("SinglePrice","PRINT_RUN"))
    plot(log(tmp[,2]),log(tmp[,1]),ylab="ln[Card Price (2011 USD)]",xlab="ln[Total Cards Printed for Set]",main="Card Prices vs. Print Run")
    abline(16.19453,-0.94359,lw=2,col="blue")
    abline((16.19453+(-1*(1-0.01454)*2)),-0.94359,lw=2,col="red",lty=3)
    abline((16.19453+((1-0.01454)*2)),-0.94359,lw=2,col="red",lty=3)
    
    
    
    #Pairwise AIC testing for model#
    #Log or not log trend? -> Logged trend better
    pricesModelLTrend <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+log(as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN,data=PRICES)
    pricesModelTrend <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+log(as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+as.numeric(TREND),data=PRICES)
    
    #Logged mana cost or not?
    pricesModelLCMC <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+log(as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN,data=PRICES)
    pricesModelCMC <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+as.numeric(CMC)+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND)),data=PRICES)
    #or quadratic -> QUADRATIC
    pricesModelQCMC <- lm(log(SinglePrice)~Rarity+Reprints+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+Set,data=PRICES)
    
    #Logged reprints? -> YES
    pricesModelLReprints <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+Set,data=PRICES)
    
    #Set rarities
    pricesModelLReprints <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+Set+Set*Rarity,data=PRICES)
    
    #With Power rating
    pricesModelModernWPR <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating,data=subset(PRICES,SinglePrice < 100))
    #Without PR
    pricesModelModernWOPR <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set,data=subset(PRICES,SinglePrice < 100))
    #Logged PR
    pricesModelModernWLPR <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating,data=subset(PRICES,SinglePrice < 100))
    
    
    #MODERN
    pricesModelModern <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating,data=subset(PRICES,SinglePrice < 100))
    residModelModern <- predict(pricesModelModern);
    write.csv(data.frame(PRICES[as.numeric(names(sort(residModelModern))),"Card"],sort(residModelModern),PRICES[as.numeric(names(sort(residModelModern))),"Set"]),"~/PowerRatings.csv")
    summary(pricesModelModern);
    plot(pricesModelModern);
    #c("Limited Edition Alpha","Limited Edition Beta","Unlimited Edition","Arabian Nights","Portal Three Kingdoms","Unglued","Unhinged")
    
    #Rarity or Rarity Index
    pricesModelModern <- lm(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating,data=subset(PRICES,SinglePrice < 100))
    
    pricesModelRRModern <- lm(log(SinglePrice)~log(Rarity.Rating)+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating,data=subset(PRICES,SinglePrice < 100))
    
    pricesModelRRModern <- lm(log(SinglePrice)~log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+Power.Rating+Rarity+Rarity.Rating,data=subset(PRICES,SinglePrice < 100))
    
    pricesModelRRModern <- lm(log(SinglePrice)~log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Power.Rating+Rarity+Rarity.Rating,data=subset(PRICES,SinglePrice < 100))
    
    
    #No logged mana cost
    library(Zelig)
    pricesMixedModel <- lmer(log(SinglePrice)~Rarity+(1|Set),data=PRICES)
    
    pricesMixedModel <- lmer(log(SinglePrice)~Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+(1|Set),data=PRICES)
    
    pricesMixedModel <- lmer(log(SinglePrice)~Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+(1|Set),data=PRICES)
    
    pricesMixedModel <- lmer(log(SinglePrice)~Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+Legendary*Creature+log(as.numeric(TREND))+(1|Set)+BLOCK+STANDARD+MODERN+Rarity.Rating,data=PRICES)
    
    
    print(pricesMixedModel)
    
    pricesMixedModel <- lmer(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity+Rarity.Rating,data=PRICES)
    
    
    pricesMixedModelwoSS <- lmer(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity+Rarity.Rating,data=subset(PRICES,Set.Size > 0))
    
    
    
    pricesMixedModelSS <- lmer(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity+Rarity.Rating+Set.Size,data=subset(PRICES,Set.Size > 0))
    
    pricesMixedModelLSS <- lmer(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity+Rarity.Rating+log(Set.Size),data=subset(PRICES,Set.Size > 0))
    
     qqnorm(sort(residuals(pricesMixedModelSS)))
     qqnorm(sort(residuals(pricesMixedModelwoSS)))
     qqnorm(sort(residuals(pricesMixedModelLSS)))
     
     #Using the set size to adjust the intercept does slightly worse on AIC, than having the cards directly inherit from set size as above.
     pricesMixedModelSbySet <- lmer(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+CldMC+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity+Rarity.Rating,data=subset(PRICES,Set.Size > 0))
    
    
    
    #NEGATIVE TREND? === YES
    library(lme4)
    formula <- formula(log(SinglePrice)~Basic+Rarity+log(Reprints)+log(Reprints)*MODERN+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Power.Rating+Commonality.Rating+Power.Rating*log(Reprints)+Power.Rating*Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints))
    model <- lmer(formula,data=PRICES)# c("Limited Edition Alpha","Limited Edition Beta","Unlimited Edition")
    model <- glmer(formula,data=PRICES,family=Gamma)
    print(model)
    qqnorm(residuals(model),ylab="Actual Quantiles",main="Model Residuals",col=1)
    abline(0,1,col="red",lw=5)
    legend(-4,5.5,c("Actual","Theoretical"),col=c(1,2),lwd=5,cex=2)
    text(x=-.7,y=2.05,labels="Underprediction",cex=1.25)
    arrows(x0=0,y0=2,x1=-1.75,y1=-1,code=2)
    arrows(x0=0,y0=2,x1=2.25,y1=3.5,code=2)
    text(x=1,y=-1,labels="Overprediction",cex=1.25)
    arrows(x0=1,y0=-.9,x1=.75,y1=0,code=2)
    
    
    
    
    paretoModel <- vglm(SinglePrice~Basic+Rarity+BLOCK+STANDARD+MODERN+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+Power.Rating+Commonality.Rating+log(Reprints)+log(Reprints)*MODERN+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+log(as.numeric(TREND))+Legendary*Creature+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Power.Rating*log(Reprints)+Power.Rating*Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints),pareto1,data=PRICES)
    qqnorm(sort(residuals(paretoModel)))
    
    
    
    test <- lm(log(SinglePrice)~Basic+Rarity+BLOCK+STANDARD+MODERN+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+Power.Rating+Commonality.Rating+log(Reprints)+log(Reprints)*MODERN+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+log(as.numeric(TREND))+Legendary*Creature+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Power.Rating*log(Reprints)+Power.Rating*Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints)+Set,data=PRICES,maxit=10)
    
    
    beta <- for (1 in length())
    
    joint <-  cbind(1:length(residuals(model)),residuals(model),sort(residuals(model)),sort(rnorm(18000)),0)
    colnames(joint) <- c("INDEX","RESID","SRESID","NORM","SUBTRACT")
    #Use appoximation
    for(i in 1:18000){
    	joint[i,5] <- joint[i,3] - (joint[i,4]*1.1-0.1);
    }
    indexes <- joint[order(joint[,2]),1]
    
    #Minimize the residuals of the line.
    plot(joint[,"SUBTRACT"]);
    mean(joint[,"SUBTRACT"]^2);
    head(joint[indexes,])
    
    #######SUB-SAMPLES###########
    ##Older sets with print run info
    formula <- formula(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity.Rating+log(PRINT_RUN))
    lmer(formula,data=subset(PRICES, PRINT_RUN > 0))
    
    
    ##Newer sets
    formula <- formula(log(SinglePrice)~Rarity+log(Reprints)+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Non.basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Power.Rating+Rarity.Rating)
    lmer(formula,data=subset(PRICES, PRINT_RUN == 0))
    
    
    #Color Bias---No even after surpressing all power rating terms
    formula <- formula(log(SinglePrice)~Rarity+log(Reprints)+log(Reprints)*MODERN+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints))
    lmer(formula,data=PRICES)# c("Limited Edition Alpha","Limited Edition Beta","Unlimited Edition")
    
    #THIS IS THE CODE FOR COLOR BIAS, but it drops variables when there are too few variables, and thus is not strictly comparable.
    #Color Bias---Even sampling on just the highest price cards, there doesn't seem to be much 
    formula <- formula(log(SinglePrice)~Rarity+log(Reprints)+log(Reprints)*MODERN+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+Set+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Rarity.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints))
    
    #Set Price Percentile here:
    pp <- 0.98
    summary(lm(formula,data=subset(PRICES,SinglePrice > quantile(PRICES[,"SinglePrice"],pp,na.rm=TRUE))))
    
    ##THIS IS THE FORMULA USED##############
    library(lme4)
    formula <- formula(log(SinglePrice)~Basic+Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Legendary*Creature+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+log(Reprints)+log(Reprints)*MODERN+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Rarity.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints)+(1|Set)+Modern.B*Legacy.B+Vintage.R*Legacy.B+Legacy.B+Vintage.B+Modern.B+Power.Rating+Power.Rating*Rarity.Rating+Power.Rating*log(Reprints)+RESERVED)#
    finalModel <- lmer(formula,data=PRICES)#
    finalModel <- lmer(formula,data=subset(PRICES, Set %ni% c("Limited Edition Alpha","Limited Edition Beta","Unlimited Edition")))
    finalModel <- lmer(formula,data=subset(PRICES,TREND > 2010))#doesn't regress now?
    qqnorm(resid(lmer(formula,data=PRICES)))#
    abline(0,1,col="red",lw=5)
    #####################
    library(Zelig)
    
    woKawigama <- subset(PRICES,Set %ni% c("Saviors of Kamigawa","Betrayers of Kamigawa","Champions of Kamigawa"));
    ###SPECIAL REQUEST MADE BY FORUM MEMBER#######
    finalModelwoKawigama <- lmer(formula,data=woKawigama)#
    
    
    
    
    #Power-Unadjusted
    pAFormula <- formula(log(SinglePrice)~Basic+Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Legendary*Creature+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+log(Reprints)+log(Reprints)*MODERN+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints)+(1|Set)+Vintage.B+RESERVED)#
    lmer(pAFormula,data=PRICES)#
    
    
    #Get the list without vintage banned
    leg1 <- PRICES[,"Legacy.B"] - PRICES[,"Vintage.B"]
    
    #Get the joint list
    leg2 <- PRICES[,"Legacy.B"]*PRICES[,"Vintage.R"]
    
    #Now get the legacy list just with out the 	
    
    
    
    #######PLOTS DISTRIBUTION OF ESTIMATES####
    plot(density(rnorm(18000,1.357027,0.319200)),col="black",lty=2,main="Colors")#colorless
    lines(density(rnorm(18000,1.066672,0.330413)),col="grey")#white
    lines(density(rnorm(18000,1.113609,0.330413)),col="blue")
    lines(density(rnorm(18000,1.151961,0.330490)),col="black")
    lines(density(rnorm(18000,0.979930,0.330328)),col="red")
    lines(density(rnorm(18000,1.139831,0.330211)),col="green")
    lines(density(rnorm(18000,1.172128,0.332111)),col="yellow")#gold
    
    
    #Get average absolute error
    (sum(abs(rnorm(18000,1.172128,0.332111)))+sum(abs(rnorm(18000,1.139831,0.330211)))+sum(abs(rnorm(18000,0.979930,0.330328)))+sum(abs(rnorm(18000,1.151961,0.330490)))++sum(abs(rnorm(18000,1.113609,0.330413)))+sum(abs(rnorm(18000,1.066672,0.330413)))+sum(abs(rnorm(18000,1.357027,0.319200))))/7
    
    #Subtract off the average error, see whether the residual is greater than 5%, if so
    #Then estimators are likely to be different
    (sum(abs(rnorm(18000,1.357027,0.319200)))-20506)/20506
    (sum(abs(rnorm(18000,1.113609,0.330413)))-20506)/20506
    (sum(abs(rnorm(18000,0.979930,0.330328)))-20506)/20506
    
    
    ##Ðis is to get the information for the table
    median(subset(PRICES,Set=="Portal Three Kingdoms" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Limited Edition Beta" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Starter 2000" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Arabian Nights" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Portal Second Age" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Limited Edition Alpha" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Unlimited Edition" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Ice Age" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Chronicles" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Fallen Empires" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Mirrodin Besieged" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    median(subset(PRICES,Set=="Revised Edition" & Basic != 1)[,"Reprints"],na.rm=TRUE)
    
    median(subset(PRICES,Set=="Portal Three Kingdoms" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Limited Edition Beta" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Starter 2000" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Arabian Nights" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Portal Second Age" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Limited Edition Alpha" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Unlimited Edition" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Ice Age" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Chronicles" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Fallen Empires" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Mirrodin Besieged" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    median(subset(PRICES,Set=="Revised Edition" & Basic != 1)[,"PRINT_RUN"],na.rm=TRUE)
    
    
    #Generating Fake Data to look see what missing variable would look like.
    plot(rnorm(18000,0,0.9109825))
    
    plot(density(residuals(lmer(formula,data=PRICES))))
    
    
    normalComponent 		<- rnorm(10000);
    loggedComponent 		<- exp(rnorm(10000));
    unkownLoggedComponent 	<- exp(rnorm(10000));
    randomError 			<- rnorm(10000);
    
    dependent 		<- exp(3*normalComponent + .1*loggedComponent + 9*unkownLoggedComponent + randomError);
    normalDependent	<- 3*normalComponent + randomError;
    
    fake <- cbind(dependent,normalDependent,normalComponent,loggedComponent,unkownLoggedComponent,randomError)
    
    #qqnorm(residuals(lm(normalDependent~normalComponent)))
    #qqnorm(residuals(lm(log(dependent)~normalComponent+log(loggedComponent)+randomError)))
    #qqnorm(residuals(lm(log(dependent)~normalComponent+log(loggedComponent)+log(unkownLoggedComponent))))
    
    qqnorm(predict(lm(log(dependent)~normalComponent+log(loggedComponent))))
    
    ##########NOW FIND SET SIZE################# 
    #Ðis algoriðm is not totally tuned, and may have results ðat are unstable.
    #Tries to find ðe lowest enþropy model
    ###########
    #regression formula
    formula <- formula(log(SinglePrice)~Rarity+log(PRINT_RUN)+log(Reprints)+log(Reprints)*MODERN+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Basic+log(as.numeric(TREND))+Legendary*Creature+BLOCK+STANDARD+MODERN+(1|Set)+Reprints*STANDARD+log(Reprints)*BLOCK+Power.Rating+Commonality.Rating+Power.Rating*log(Reprints)+Power.Rating*Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints))
     
    #First select all sets without numbers
    setTrend <- unique(subset(PRICES,PRINT_RUN == 0 | PRINT_RUN == NA,select=c("Set","TREND")))
    order(setTrend[,"TREND"])
    
    #Now order them along the time dimension
    setsWithoutPrintRunInfo <- setTrend[order(setTrend[,"TREND"]),]
    
    #Duplicate our pricing info
    #missing <- c("Portal Three Kingdoms","Revised Edition","Starter 2000","Portal Second Age","Mirrodin Besieged","Revised Edition")
    #tmpPRICES <- rbind(subset(PRICES, PRINT_RUN > 0));
    tmpPRICES <- PRICES
    #First we'll initialize that print run size to something plausible: 1,000,000 cards.
    tmpPRICES[!complete.cases(tmpPRICES[,"PRINT_RUN"]),"PRINT_RUN"] <- 500000000
    tmpPRICES[tmpPRICES[,"PRINT_RUN"]==0,"PRINT_RUN"]  <- 500000000
    #Now we'll bind a column for printRunData
    printRunSize <- 1:length(setsWithoutPrintRunInfo[,1]);
    setsWithoutPrintRunInfo<- cbind(setsWithoutPrintRunInfo,printRunSize);
    
    
    #Now, for each set we're going to try and find a set size;
    setsWithoutPrintRunInfo[,"printRunSize"] <- 0;
    
    currentAIC <- AIC(lmer(formula,data=tmpPRICES));
    
    #Starting to loop through sets
    for (s in 1:length(setsWithoutPrintRunInfo[,1])){
    	#(length(setsWithoutPrintRunInfo[,1])-1)
    	#AIC is essentially AICc because sample size is nigh assymptotic
    	#and the number of regressors is low
    	
    	previousAIC <- rnorm(1,currentAIC,2);
    	
    	testSetSize <- mean(tmpPRICES[as.numeric(rownames(subset(tmpPRICES, Set==setsWithoutPrintRunInfo[s,1],select=PRINT_RUN))),"PRINT_RUN"],na.rm=TRUE)
    	print(paste("Current set AIC is:",setsWithoutPrintRunInfo[s,1],previousAIC))
    	repeat {
    		#lm(log(SinglePrice)~log(PRINT_RUN),data=tmpPRICES)#Linear version
    		
    		currentAIC <- AIC(lmer(formula,data=tmpPRICES));#subset(tmpPRICES, Set %ni% setsWithoutPrintRunInfo[(s+1):length(setsWithoutPrintRunInfo[,1]),"Set"])
    		# stopping criterion
    		#print(paste(currentAIC,"vs.",previousAIC));
    		
    		#Sensitivity is set according to relative liklihood at 5% CI level.
    		if (abs(currentAIC - previousAIC) < .03)  break;
    		#If this AIC is lower, then take it.
    		#Gets size just for the 
    		
    
    		if (currentAIC < previousAIC){
    			#We'll just add a fraction (to avoid bouncing back and forth if were same as below)
    			testSetSize <- testSetSize*1.1;
    		
    			#Add to list for reference
    		
    		} else {
    			#Reduce it by a fraction
    			testSetSize <- testSetSize/1.11;
    		} 
    			setsWithoutPrintRunInfo[s,"printRunSize"] <- testSetSize;
    		#Set the size again for new run.
    		tmpPRICES[as.numeric(rownames(subset(tmpPRICES, Set==setsWithoutPrintRunInfo[s,1],select=PRINT_RUN))),"PRINT_RUN"] <- setsWithoutPrintRunInfo[s,"printRunSize"];
    		previousAIC <<- currentAIC;
    		print(paste("Print run is:",setsWithoutPrintRunInfo[s,"printRunSize"]))
    	}#taeper
    }#rof
    
    	qqnorm(resid(lmer(formula,data=tmpPRICES)))
    	
    
    ####
    #Useful functions
    
    
    Hausman <-function(b0,b1,se0,se1){
    	#Hausmann on Estimators: H_0 = (b_1-b_0)'ginv(s.e.^2-se_0^2)(b_1-b_0)
    	##Hausman
    	x <- t(b1-b0)%*%ginv(se0^2 - se1^2)%*%(b1-b0)
    	
    	#Chi-square with rank equal to the variance vector, returing p-value
    	pchisq(abs(x),rank((se0^2 - se1^2)),lower.tail=FALSE);
    }
    
    
    ##Tests
    
    Hausman(-1.73,-1.77,.52,.54);#Legacy*Modern
    Hausman(-1.67,-1.80,.28,.30);#Legacy*Vintage
    Hausman(-1.67,-1.80,.28,.30);
    
    
    #Experiments
    formula <- formula(log(SinglePrice)~Basic+Rarity+COLOR+as.numeric(CMC)+as.numeric(as.numeric(CMC)*as.numeric(CMC))+as.numeric(CldMC)+as.numeric(as.numeric(CldMC)*as.numeric(CldMC))+Legendary+Creature+Instant+Sorcery+Enchantment+Equipment+Aura+Planeswalker+Artifact+Land+Legendary*Creature+log(as.numeric(TREND))+BLOCK+STANDARD+MODERN+log(Reprints)+log(Reprints)*MODERN+log(Reprints)*STANDARD+log(Reprints)*BLOCK+Commonality.Rating+Creature*log(as.numeric(TREND))+log(as.numeric(TREND))*log(Reprints)+Modern.B*Legacy.B+Vintage.R*Legacy.B+Legacy.B+Vintage.B+Modern.B+Power.Rating+Power.Rating*Commonality.Rating+Power.Rating*log(Reprints)+RESERVED+(1+log(TREND)+Rarity|Set))#
    finalModel <- lmer(formula,data=PRICES)#
    Posted in: Articles
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 2
    This thread is for the discussion of my latest article, Flogging the Data: Determinants of Card Prices, Part 2. We would be grateful if you would let us know what you think, but please keep your comments on topic.
    Posted in: Articles
  • posted a message on Wizards of the Coast Sued over Magic Online
    I work for the Swiss patent office---This patent is why Switzerland doesn't allow software patents.

    Quote from "9909 »
    I can't see any infringement (hey, but I'm not an patent attorney in the US).


    I see lots of litigation opportunities within the patent. He's also probably not a troll because he has a patent on the invention in Japan and looks like a single inventor.


    What's interesting is this guy's patent was filed on March 6, 1995.

    Richard Garfield's Trade Card Game Method of Play patent was filed on October 17, 1995 (http://worldwide.espacenet.com/publicationDetails/originalDocument?FT=D&date=19970902&DB=worldwide.espacenet.com&locale=en_EP&CC=US&NR=5662332A&KC=A&ND=4).

    This guy's electronic TCG patent could invalidate Garfield's patent....
    Posted in: Submit News
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 1
    > Have you studied US law?
    No, only public international law formally, and some UK and Swiss law.

    > "privity" doesn't apply to promissory estoppel as far as I know
    True; it's contract doctrine. If we admit the collectibility was part of the purpose of the good and the transaction was based on that, it seems hard to believe that WotC can be made liable for all subsequent transactions. In short, I don't believe that all losses third-party transactions can be laid at the feet of WotC due to their reprint changes, which is to induce sales to the first party.

    > I listed the actual elements for you and they fit.
    I basically agree as well, BUT:
    a. I'm not certain what the scope of that obligation actually entails, contrary to some of the estoppel cases, the collectors are only out the initial purchase for which they received a good before the reserved list, i.e. people who purchased the original black lotus cannot did not receive any such warranty.

    > Restatement the Second of Contracts § 90.
    Third parties apparently have some rights under §90 as you point out, but I thought we agreed it wasn't a contract (apart from initial sales)?
    Posted in: Articles
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 1
    As to estoppel:
    1. Yes, I agree the original purchasers had (more) than a reasonable expectation that the cards would not printed; indeed this was what motivated wary collectors to purchase these in the first place;
    2. My initial reaction was to think that caveat emptor would preclude the detrimental reliance; with a bit more research, I don't think that this defence would work in that the seller controls the purpose fitness of the goods, i.e. for collection. A buyer can't rely on caveat emptor if the goods are not fit for their particular purpose; collection value is only a purpose that can be determined ex post. Collection was one of the main selling points and purposes of the game during the baseball craze; this card backs still bear "The Gathering" as a mark.
    3. As far as the third element of "injustice", its clear that some sort of "collection" injustice has been perpetrated. Affidavits would certainly bear that out. It's not clear that the injustice is much more than loss of expected profits (i.e. people still have their collectable cards, albeit their "collectibility" is now diminished)

    Now to damages:
    A. Damages would limited themselves to the original MSRP + interest + inflation;
    B. By privity, only people purchasing original cases and packs would have standing;
    C. Only sets after the institution of the policy on March 4th 1996 and before Mercadian Masques would qualify (October 4th, 1999).

    Hence, it's not really clear what sort of effective liability they would actually have.
    Posted in: Articles
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 1
    The editors here and at SCG are cagey about publishing this type of article because it might lose some of the audience. I'm glad for all the pertinent comments, questions and critique because it means that there is some interest for this type of analysis--technicality notwithstanding.


    At least two of you have mentioned time-based aspects of pricing, e.g. how prices evolve. This is possible, but an easier data collection mechanism is needed. If someone has a bot that can download daily prices, there's at least one article to be written with daily data.


    Quote from bataleur »
    if you ever felt like doing a more complex version the question which really wants addressing is the impact of format legality on card prices


    Wait for Part 2. The results get a bit more interesting (and speculative).


    Quote from euknemarchon »
    Where are 3.1.3 and 3.1.4?

    In Part 2 of the Article. Going from automated LaTeX to manual BBS also means stuff gets lost in translation, sorry.

    Quote from euknemarchon »
    Does the author seem surprised that aesthetic utility would be a determinant of prices (2.1)?

    Yes, he doth. But only because he let his personal bias against foil cards slip in, and didn't edit his predilections out of the article. Econometrically, they should more or less be dealt with implicitly in the set variables.

    Quote from euknemarchon »
    4. At least in the US, liability on a promissory estoppel theory is way more plausible than an implicit contract theory; it's unclear that there would have been any consideration exchanged between WotC and collectors (3.1.5)

    Probably, promissory estoppel seems like it would be weaker in terms of liability though, caveat emptor.
    I think WotC's line of, "We can't reprint," doesn't hold legal water--perhaps that should be another article--pm me if some one would be interested in writing it together.

    Quote from sephirothx »
    just showing the proof of this information?

    It does "prove" in some sense this intuition, but more importantly it measures the effect.

    Quote from sephirothx »
    Vendors do not collude in any meaningful way

    I assume they don't collude. Whether they collude or not would only be a real issue if I tried to record multiple observations for the exact same card (it would invalidate the standard errors, i.e. inferences about significance)-so it's probably a confusing side note that should have been eliminated from the BBS version of the article.

    Quote from sephirothx »
    Can the data you've compiled be applied to explanations for things like 'casual favorites'

    In principle yes; it might be hard to draw up a list that is theoretically consistent though. Individual casual card prices perhaps more simply just be evaluated against the price that the model predicts.

    That is you substitute all the attributes of the casual card into the equation, and then see if the casual card's actual price is less than or equal to the predicted price.

    Quote from EvilNerdINC »
    are you using R or R commander to create your tables/graphs?

    I use straight up R script; it's a bit arcane, but there is a record of what I've done for reference and reproduction.
    Posted in: Articles
  • posted a message on Flogging the Data: Determinants of Card Prices, Part 1
    This thread is for the discussion of my latest article, Flogging the Data: Determinants of Card Prices, Part 1. We would be grateful if you would let us know what you think, but please keep your comments on topic.
    Posted in: Articles
  • posted a message on [Deck]Merfolk
    Dear Lord Rewind,

    That is the exact sort of thoughtful response I was looking for.
    Anyone else care to weigh in?
    Posted in: Aggro & Tempo
  • posted a message on [Deck]Merfolk
    Can the fish players weigh in on Ian Kendall's latest SCG open deck:
    0. Is Standstill better than alternatives (more Lords, Jitte, etc.)?
    0.a. Is Standstill too skill intensive of a card for a mediocre Legacy player?
    1. Is Hibernation better than alternatives like Perish?
    2. Should Sower of Temptation be main deck?
    3. Should Kira be main deck?
    4. Is Deathmark an alternative to Submerge in Dark Fish?

    What is necessary to give the deck legs against Maverick and RUG Delver?
    Posted in: Aggro & Tempo
  • posted a message on Flogging the Data: Sizing up the Legacy Metagame
    Still waiting eagerly for that article!

    Glad to hear someone's interested. It's definitely written, but the editorial team said its unintelligible to all but economists, so they basically vetoed publishing it in its current form. I write for myself more than an audience, and I've been too occupied to essentially rewrite a 19-page article...

    What do you think about shocklands being reprinted in Return to Ravnica?


    This to my knowledge has not been confirmed yet.


    Will it drive their prices up or down?


    Probably up. It would mean they become standard legal, this drives average card prices up by 35% according to my estimates.

    The reprint will drive prices down by 5%. So that is a net of about 30%.
    Posted in: Articles
  • posted a message on How do you manage and maintain your collection?
    Yes, about 1,000 playables (e.g. duals) + 1,000 other (e.g. serra angel, sculpting steel, etc.). I usually toss the commons from Draft out, but this seems wasteful.
    Posted in: Magic General
  • posted a message on How do you manage and maintain your collection?
    My collection is starting to get fairly large (1000-2500). It covers principally the æternal formats: Vintage, Legacy, Modern, Cube, Commander plus some miscellaneous cards. It's to the point where it's sort of a hassle (I know stupid to complain about too many cards.)

    How do you gals and guys manage organize and maintain your collections?

    By color, format, set, alphabetically?

    Do you manage it electronically? If so how do you keep in in sync?

    When and how do you decide what to sell off?

    What determines acquisition priorities?

    How do you handle sleeves and multiple decks?

    Borrowed and loaned cards?

    etc.

    Give me some of your tips and ideas.
    Posted in: Magic General
  • posted a message on [Deck] Sneak Show
    Gristlebrand is absurd in this deck. At least with the other two cards there is a chance to react, but Gristlebrand wins with the first activation. If the opponent has StP, a second activation ensures a FoW or Mis-D can be found.
    Posted in: Combo
  • To post a comment, please or register a new account.