diff --git a/07_final_assignment/baboonSimulation.R b/07_final_assignment/baboonSimulation.R index 0887361..8329e01 100644 --- a/07_final_assignment/baboonSimulation.R +++ b/07_final_assignment/baboonSimulation.R @@ -1,5 +1,7 @@ library(testthat) library(ndl) +library(compiler) +enableJIT(3) monkeydat <- data.frame(Monkey=c("DAN", "ART", "CAU", "DOR", "VIO", "ARI"), NumTrials=c(56689, 50985, 61142, 49608, 43041, 55407), @@ -234,62 +236,68 @@ expect_equal(monkey$Rate("c"), "Nonword") }) +prepareDat <- function(){ + dat <- read.table("dataDan.txt", header=T, stringsAsFactors=F) + dat$Cues <- orthoCoding(dat$String, grams=2) + dat$Frequency <- 1 + dat$Stimulus <- dat$Cues + dat$StimulusType <- factor(ifelse(dat$Type == "word", "NewWord", "Nonword"), c("Nonword","NewWord","LearnedWord")) + dat$Outcomes <- factor(ifelse(dat$Type == "word", "Word", "Nonword"), c("Word","Nonword")) + dat <- dat[sample(1:nrow(dat)),] + cues <- unique(unlist(strsplit(dat$Cues, "_"))) + outcomes <- levels(dat$Outcomes) + list(cues=cues,outcomes=outcomes,dat=dat) +} -dat <- read.table("dataDan.txt", header=T, stringsAsFactors=F) -dat$Cues <- orthoCoding(dat$String, grams=2) -dat$Frequency <- 1 -dat$Stimulus <- dat$Cues -dat$StimulusType <- factor(ifelse(dat$Type == "word", "NewWord", "Nonword"), c("Nonword","NewWord","LearnedWord")) -dat$Outcomes <- factor(ifelse(dat$Type == "word", "Word", "Nonword"), c("Word","Nonword")) +runSim <- function(data, trialCount, alpha, beta, lambda) { + monkey <- MakeMonkey(data$cues, data$outcomes, alpha, beta, lambda=1.0) + trialNum <- round(trialCount) + pres <- PresentTrials( + trialNum, + monkey$Learner,data$dat) + pres +} -dat <- dat[sample(1:nrow(dat)),] -cues <- unique(unlist(strsplit(dat$Cues, "_"))) -outcomes <- levels(dat$Outcomes) -monkey <- MakeMonkey(cues, outcomes, alpha=sqrt(0.001), beta=sqrt(0.001), lambda=1.0) -monkeyName <- "DAN" -trialNum <- round(0.5 * as.numeric(monkeydat[monkeydat$Monkey == monkeyName,"NumTrials"])) -system.time(pres <- PresentTrials( - trialNum, - monkey$Learner,dat)) +analyseSim <- function(pres){ + learnedWordNum <- nrow(pres$Stimuli[pres$Stimuli$StimulusType == "LearnedWord",]) + trialNum <- nrow(pres$Trials) + nonwordTrials <- pres$Trials[pres$Trials$StimulusType == "Nonword",] + wordTrials <- pres$Trials[pres$Trials$StimulusType != "Nonword",] + presNonwordNum <- length(unique(nonwordTrials$Stimulus)) + presWordNum <- length(unique(wordTrials$Stimulus)) + nonwordAcc <- nrow(nonwordTrials[nonwordTrials$Response == "Nonword",]) / nrow(nonwordTrials) + wordAcc <- nrow(nonwordTrials[wordTrials$Response == "Word",]) / nrow(wordTrials) + genAcc <- (nrow(nonwordTrials) * nonwordAcc + nrow(wordTrials) * wordAcc) / trialNum + c("Sim", + trialNum, + learnedWordNum, + presNonwordNum, + genAcc, + wordAcc, + nonwordAcc) +} -# Analyse data: -learnedWordNum <- nrow(pres$Stimuli[pres$Stimuli$StimulusType == "LearnedWord",]) -trialNum <- nrow(pres$Trials) -nonwordTrials <- pres$Trials[pres$Trials$StimulusType == "Nonword",] -wordTrials <- pres$Trials[pres$Trials$StimulusType != "Nonword",] -presNonwordNum <- length(unique(nonwordTrials$Stimulus)) -presWordNum <- length(unique(wordTrials$Stimulus)) -nonwordAcc <- nrow(nonwordTrials[nonwordTrials$Response == "Nonword",]) / nrow(nonwordTrials) -wordAcc <- nrow(nonwordTrials[wordTrials$Response == "Word",]) / nrow(wordTrials) -genAcc <- (nrow(nonwordTrials) * nonwordAcc + nrow(wordTrials) * wordAcc) / trialNum +simulateAndAnalyse <- function(data, trialCount, alpha=sqrt(0.001), beta=sqrt(0.001)){ + p <- runSim(data, trialCount, alpha, beta, lambda=1) + analyseSim(p) +} -monkeydat <- rbind(monkeydat, - c(paste(monkeyName, "Sim1"), - trialNum, - learnedWordNum, - presNonwordNum, - genAcc, - wordAcc, - nonwordAcc)) +data <- prepareDat() -# TODO: Das in schoene Funktionen packen ;) +n <- 10 +trialCount <- 1000 +for( a in 0:n) { + k <- 1.0 / n * a + print(k) + s <- simulateAndAnalyse(data, trialCount, alpha=1, beta=k) + s[1] <- as.character(k) + monkeydat <- rbind(monkeydat, + s) +} +monkeydat + # TODO: Durchlaufen lassen fuer ca 50k Trials fuer verschiedene alpha, beta zwischen 0 und 1 # TODO: Plotten der verschiedenen Ergebnisse (num,acc) als heatmap 2d plot. # TODO: Plotten der Unterschiede zu den Vorgabeaffen und optimale alpha beta fuer diese finden. - -# what would be the theoretic success rates? -wRW <- monkey$GetWeights() -aRW <- estimateActivations(dat, wRW)$activationMatrix -aRW <- aRW[,order(colnames(aRW))] -dat$ChoiceRW <- apply(aRW, 1, FUN=function(v){ - if(v["Nonword"] >= v["Word"]) { - return("Nonword") - } else { - return("Word") - }}) -table(dat$Type, dat$ChoiceRW) - - # EOF -