plot.sj(p.stm(c(100, 100)), main='Single Threshold Model')
plot.sj(p.stm(c(200, 100)), add=TRUE, col='dodgerblue3')
plot.sj(p.stm(c(400, 100)), add=TRUE, col='orangered')
# now fix the threshold and change the sensory noise
# now that we've visualized the model, let's try and fit it to some actual data!!
# first we need some data
async_data = read.csv('sync_data.csv', row.names=1)
async_data = as.matrix(async_data)
# let's just fit a single subject
y = async_data[3,]
plot.sj(y, type='o')
# Check out cost.sse and optim.model_sse in simple_sj.R
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.single_threshold_model)
# what is returned?
best_fit.st
# NB: if you are getting fitted values that are very large/small or near the boundary
# it may be that you had a particularly bad guess and need to try more initial conditions,
# or switch optimization strategies, or the model is really really misspecified
# NB: convergence = 0 is a good thing, but doesn't guarantee optimalit
# run the following line for more details
?optim
# now that we have our fitted parameters, get the predictions
fitted.st = predict.single_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, asynchronies, type='l', col='dodgerblue3', lwd=2, add=TRUE, draw_peak = FALSE)
# quantify the fit
cost.sse(y, fitted.st) # same as best_fit$value
sqrt(mean((y-fitted.st)^2))
cor(y, fitted.st)^2
mean(abs(y-fitted.st))
# for fun, pick another subject and checkout the fit (go back to Line 39 and change the row index)
# is this fit good?
# this is actually a hard question to answer. so let's not try yet
# Instead, let's build a more complex model and see if it beats the simpler model
# checkout predict.double_threshold_model in sj_modeling.R
setwd('~/Dropbox/MultisensoryIntegration/Papers/McGurk_MTurk_Compare/IMRF_Educational_Talk/part3_modeling/')
#
# Model visualization, fitting, and assessing
#
# clear out the workspace
rm(list=ls())
# go to where the code is
setwd('~/Dropbox/MultisensoryIntegration/Papers/McGurk_MTurk_Compare/IMRF_Educational_Talk/part3_modeling/')
# define a range of asynchronies to test (should correspond to your behavioral data)
asynchronies = c(-300, -267, -200, -133, -100, -67, 0, 67, 100, 133, 200, 267, 300, 400, 500)
# load the functions needed
source('sj_modeling.R')
# Let's explore the basic model
# Open sj_modeling.R and locate the function predict.single_threshold_model
yhat_st = predict.single_threshold_model(c(200, 100), asynchronies)
plot.sj(yhat_st)
# let's plot a few curves to see how the parameters impact the predictions
# the function p.stm is used here to make the code shorter, but it's the same as predict.single_threshold_model
plot.sj(p.stm(c(100, 100)), main='Single Threshold Model')
plot.sj(p.stm(c(200, 100)), add=TRUE, col='dodgerblue3')
plot.sj(p.stm(c(400, 100)), add=TRUE, col='orangered')
# now fix the threshold and change the sensory noise
# now that we've visualized
async_data = read.csv('sync_data.csv', row.names=1)
async_data = as.matrix(async_data)
y = async_data[3,]
plot.sj(y, type='o')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.single_threshold_model)
fitted.st = predict.single_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, asynchronies, type='l', col='dodgerblue3', lwd=2, add=TRUE, draw_peak = FALSE)
cost.sse(y, fitted.st) # same as best_fit$value
sqrt(mean((y-fitted.st)^2))
cor(y, fitted.st)^2
mean(abs(y-fitted.st))
yhat_dt = predict.double(c(-200, 300, 100), asynchronies)
plot.sj(yhat_stg)
yhat_dt = predict.double_threshold_model(c(-200, 300, 100), asynchronies)
plot.sj(yhat_dt)
best_fit.stg = optim.model_sse(y, asynchronies, c(200, 100, 0.1),
predict.single_threshold_guessing_model)
fitted.dt = predict.double_threshold_bias_model(best_fit.dt$par, asynchronies)
best_fit.dt = optim.model_sse(y, asynchronies, c(200, 100, 0.1),
predict.double_threshold_model)
fitted.dt = predict.double_threshold_bias_model(best_fit.dt$par, asynchronies)
plot.sj(y, asynchronies, type='p') # actual data
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='orange', add=TRUE, lwd=2)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE, lwd=2)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
fitted.dt = predict.double_threshold_model(best_fit.dt$par, asynchronies)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
best_fit.dt = optim.model_sse(y, asynchronies, c(200, 100, 0.1),
predict.double_threshold_model)
best_fit.dt = optim.model_sse(y, asynchronies, c(-200, 300, 100),
predict.double_threshold_model)
fitted.dt = predict.double_threshold_model(best_fit.dt$par, asynchronies)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE, lwd=2)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
abline(v=best_fit.dt$par[1:2], col='orange')
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3')
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3', lwd=2, lty=2)
abline(v=best_fit.dt$par[1:2], col='orange', lwd=2, lty=2)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE, lwd=2)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
#draw the fitted syncrhony window
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3', lwd=2, lty=2)
abline(v=best_fit.dt$par[1:2], col='orange', lwd=2, lty=2)
cost.sse(y, fitted.st)
cost.sse(y, fitted.dt)
yhat_dtb = predict.double_threshold_bias_model(c(-100, 250, 120, .2), asynchronies)
plot.sj(yhat_dtb, asynchronies, main='Double Threshold')
plot.sj(yhat_dtb, main='Double Threshold w/ Bias')
best_fit.dtb = optim.model_sse(y, asynchronies, c(-200, 250, 100, .2), predict.double_threshold_bias_modell)
best_fit.dtb = optim.model_sse(y, asynchronies, c(-200, 250, 100, .2), predict.double_threshold_bias_model)
fitted.dtb = predict.double_threshold_bias_model(best_fit.dtb$par, asynchronies)
plot.sj(y, asynchronies, type='p', draw_peak = FALSE)
plot.sj(y, type='p', draw_peak = FALSE)
lines(asynchronies, fitted.dt, col='dodgerblue3', lwd=2, lty=1)
plot.sj(y, type='p', draw_peak = FALSE)
plot.sj(fitted.st, col='dodgerblue3')
plot.sj(y, type='p', draw_peak = FALSE)
plot.sj(y, type='p')
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.dtg, col='orange', lty=2, add=TRUE)
plot.sj(fitted.dtb, col='orange', lty=2, add=TRUE)
plot.sj(fitted.dtb, col='orange', add=TRUE)
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.dt, col='orange', add=TRUE)
plot.sj(fitted.dtb, col='darkgreen', add=TRUE)
fits.st = apply(async_data, 1, optim.model_sse,
asynchronies,
c(200, 100),
predict.single_threshold_model)
pars.st = sapply(fits.st, get_pars)
pars.st = sapply(fits.st, get_pars)
yhat.st = apply(pars.st, 2, predict.single_threshold_model, asynchronies)
fits.dt = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100),
predict.double_threshold_model)
pars.dt = sapply(fits.dt, get_pars)
yhat.dt = apply(pars.dt, 2, predict.double_threshold_model, asynchronies)
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], asynchronies, type='p', axes=F)
lines(asynchronies, yhat.st[,ii], col='dodgerblue3', lwd=2)
lines(asynchronies, yhat.dt[,ii], col='orangered', lwd=2)
box()
}
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], asynchronies, type='p', axes=F)
lines(asynchronies, yhat.st[,ii], col='dodgerblue3', lwd=2)
lines(asynchronies, yhat.dt[,ii], col='orangered', lwd=2)
box()
}
warnings()
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3')
plot.sj(yhat.dt[,ii], col='orangered')
box()
}
yhat.st
yhat.dt
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3')
plot.sj(yhat.dt[,ii], col='orangered')
box()
}
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3', add=TRUE)
plot.sj(yhat.dt[,ii], col='orangered', add=TRUE)
box()
}
plot.sj(y, type='p')
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.dt, col='orange', add=TRUE)
plot.sj(fitted.dtb, col='darkgreen', add=TRUE)
plot.sj(y, type='p')
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.dt, col='orange', add=TRUE)
plot.sj(fitted.dtb, col='darkgreen', add=TRUE)
fits.st = apply(async_data, 1, optim.model_sse,
asynchronies,
c(200, 100),
predict.single_threshold_model)
pars.st = sapply(fits.st, get_pars)
yhat.st = apply(pars.st, 2, predict.single_threshold_model, asynchronies)
fits.dt = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100),
predict.double_threshold_model)
pars.dt = sapply(fits.dt, get_pars)
yhat.dt = apply(pars.dt, 2, predict.double_threshold_model, asynchronies)
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3', add=TRUE)
plot.sj(yhat.dt[,ii], col='orangered', add=TRUE)
box()
}
fits.dtb = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100, .2),
predict.double_threshold_bias_model)
fits.dtb = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100, .2),
predict.double_threshold_bias_model)
pars.dtb = sapply(fits.dtb, get_pars)
yhat.dtb = apply(pars.dtb, 2, predict.double_threshold_bias_model, asynchronies)
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3', add=TRUE)
plot.sj(yhat.dt[,ii], col='orange', add=TRUE)
plot.sj(yhat.dtb[,ii], col='darkgreen', add=TRUE)
box()
}
n_trials = 12
async_counts = async_data * n_trials
bic_matrix = array(NA, c(16, 2))
for(ii in 1:16) {
bic_matrix[ii,1] = cost.BIC(async_counts[ii,], yhat.st[,ii], rep(n_trials, length(asynchronies)), n.par=2)
bic_matrix[ii,2] = cost.BIC(async_counts[ii,], yhat.dt[,ii], rep(n_trials, length(asynchronies)), n.par=3)
bic_matrix[ii,3] = cost.BIC(async_counts[ii,], yhat.dtb[,ii], rep(n_trials, length(asynchronies)), n.par=4)
}
bic_matrix = array(NA, c(16, 3))
for(ii in 1:16) {
bic_matrix[ii,1] = cost.BIC(async_counts[ii,], yhat.st[,ii], rep(n_trials, length(asynchronies)), n.par=2)
bic_matrix[ii,2] = cost.BIC(async_counts[ii,], yhat.dt[,ii], rep(n_trials, length(asynchronies)), n.par=3)
bic_matrix[ii,3] = cost.BIC(async_counts[ii,], yhat.dtb[,ii], rep(n_trials, length(asynchronies)), n.par=4)
}
dev.off()
bic_diff <- c(diff(t(bic_matrix)))
bic_diff
bic_diff <- c(diff(t(bic_matrix[,1:2])))
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orangered'))
abline(h=0, col='lightgray')
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylim=c(-80, 20))
abline(h=0, col='lightgray')
bic_matrix
bic_matrix[,2] - bic_matrix[,1]
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylim=c(-80, 20))
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'))
abline(h=0, col='lightgray')
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'), ylab='BIC Difference')
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
barplot(bic_diff, las=1, border=NA,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylab='BIC Difference', xlab='Subject')
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
bic_diff <- bic_matrix[,3] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'darkgreen'),
ylab='BIC Difference', las=1, border=NA)
bic_diff <- bic_matrix[,3] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'darkgreen', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
sum(bic_diff)
mean(bic_diff)
wilcox.test(bic_diff)
y = async_data[7,]
plot.sj(y, type='o')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.single_threshold_model)
fitted.st = predict.single_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, asynchronies, type='l', col='dodgerblue3', lwd=2, add=TRUE, draw_peak = FALSE)
cost.sse(y, fitted.st) # same as best_fit$value
sqrt(mean((y-fitted.st)^2))
cor(y, fitted.st)^2
mean(abs(y-fitted.st))
yhat_dt = predict.double_threshold_model(c(-200, 300, 100), asynchronies)
plot.sj(yhat_dt)
best_fit.dt = optim.model_sse(y, asynchronies, c(-200, 300, 100),
predict.double_threshold_model)
fitted.dt = predict.double_threshold_model(best_fit.dt$par, asynchronies)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE, lwd=2)
plot.sj(fitted.dt, col='orange', add=TRUE, lwd=2)
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3', lwd=2, lty=2)
abline(v=best_fit.dt$par[1:2], col='orange', lwd=2, lty=2)
source('sj_modeling.R')
yhat_st = predict.symmetric_threshold_model(c(200, 100), asynchronies)
plot.sj(yhat_st)
plot.sj(p.stm(c(100, 100)), main='Single Threshold Model')
plot.sj(p.stm(c(100, 100)), main='Single Threshold Model')
plot.sj(p.stm(c(200, 100)), add=TRUE, col='dodgerblue3')
plot.sj(p.stm(c(400, 100)), add=TRUE, col='orangered')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.symmetric_threshold_model)
best_fit.st
fitted.st = predict.ssymmetric_threshold_model(best_fit.st$par, asynchronies)
fitted.st = predict.symmetric_threshold_model(best_fit.st$par, asynchronies)
fitted.st = predict.symmetric_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
y = async_data[7,]
plot.sj(y, type='o')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.symmetric_threshold_model)
plot.sj(y, type='p')
y = async_data[7,]
plot.sj(y, type='p')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.symmetric_threshold_model)
fitted.st = predict.symmetric_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
cost.sse(y, fitted.st) # same as best_fit$value
sqrt(mean((y-fitted.st)^2))
cor(y, fitted.st)^2
mean(abs(y-fitted.st))
yhat_at = predict.asymmetric_threshold_model(c(-200, 300, 100), asynchronies)
plot.sj(yhat_at)
best_fit.at = optim.model_sse(y, asynchronies, c(-200, 300, 100),
predict.asymmetric_threshold_model)
fitted.at = predict.asymmetric_threshold_model(best_fit.at$par, asynchronies)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE, lwd=2)
plot.sj(fitted.at, col='orange', add=TRUE, lwd=2)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.at, col='orange', add=TRUE)
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3', lwd=2, lty=2)
abline(v=best_fit.at$par[1:2], col='orange', lwd=2, lty=2)
cost.sse(y, fitted.st)
cost.sse(y, fitted.at)
yhat_atb = predict.asymmetric_threshold_bias_model(c(-100, 250, 120, .2), asynchronies)
plot.sj(yhat_dtb, main='Double Threshold w/ Bias')
plot.sj(yhat_atb, main='Double Threshold w/ Bias', col='darkgreen')
plot.sj(yhat_at, add=TRUE, col='orange')
yhat_atb = predict.asymmetric_threshold_bias_model(c(-100, 250, 120, .2), asynchronies)
yhat_at = predict.asymmetric_threshold_model(c(-100, 250, 120), asynchronies)
plot.sj(yhat_atb, main='Double Threshold w/ Bias', col='darkgreen')
plot.sj(yhat_at, add=TRUE, col='orange')
best_fit.atb = optim.model_sse(y, asynchronies, c(-200, 250, 100, .2), predict.asymmetric_threshold_bias_model)
fitted.atb = predict.asymmetric_threshold_bias_model(best_fit.atb$par, asynchronies)
plot.sj(y, type='p')
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.at, col='orange', add=TRUE)
plot.sj(fitted.atb, col='darkgreen', add=TRUE)
fits.st = apply(async_data, 1, optim.model_sse,
asynchronies,
c(200, 100),
predict.symmetric_threshold_model)
fits.st = apply(async_data, 1, optim.model_sse,
asynchronies,
c(300, 100),
predict.symmetric_threshold_model)
pars.st = sapply(fits.st, get_pars)
yhat.st = apply(pars.st, 2, predict.symmetric_threshold_model, asynchronies)
fits.at = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100),
predict.asymmetric_threshold_model)
pars.at = sapply(fits.at, get_pars)
yhat.at = apply(pars.at, 2, predict.asymmetric_threshold_model, asynchronies)
fits.atb = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100, .2),
predict.asymmetric_threshold_bias_model)
pars.atb = sapply(fits.atb, get_pars)
yhat.atb = apply(pars.atb, 2, predict.asymmetric_threshold_bias_model, asynchronies)
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3', add=TRUE)
plot.sj(yhat.at[,ii], col='orange', add=TRUE)
plot.sj(yhat.atb[,ii], col='darkgreen', add=TRUE)
box()
}
n_trials = 12
async_counts = async_data * n_trials
bic_matrix = array(NA, c(16, 3))
n_trials = 12
async_counts = async_data * n_trials
bic_matrix = array(NA, c(16, 3))
for(ii in 1:16) {
bic_matrix[ii,1] = cost.BIC(async_counts[ii,], yhat.st[,ii], rep(n_trials, length(asynchronies)), n.par=2)
bic_matrix[ii,2] = cost.BIC(async_counts[ii,], yhat.at[,ii], rep(n_trials, length(asynchronies)), n.par=3)
bic_matrix[ii,3] = cost.BIC(async_counts[ii,], yhat.atb[,ii], rep(n_trials, length(asynchronies)), n.par=4)
}
dev.off()
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
bic_diff <- bic_matrix[,3] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'darkgreen', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
sum(bic_diff)
mean(bic_diff)
wilcox.test(bic_diff)
rm(list=ls())
setwd('~/Dropbox/MultisensoryIntegration/Papers/McGurk_MTurk_Compare/IMRF_Educational_Talk/part3_modeling/')
asynchronies = c(-300, -267, -200, -133, -100, -67, 0, 67, 100, 133, 200, 267, 300, 400, 500)
source('sj_modeling.R')
yhat_st = predict.symmetric_threshold_model(c(200, 100), asynchronies)
plot.sj(yhat_st)
plot.sj(p.stm(c(100, 100)), main='Single Threshold Model')
plot.sj(p.stm(c(200, 100)), add=TRUE, col='dodgerblue3')
plot.sj(p.stm(c(400, 100)), add=TRUE, col='orangered')
async_data = read.csv('sync_data.csv', row.names=1)
async_data = as.matrix(async_data)
y = async_data[7,]
plot.sj(y, type='p')
best_fit.st = optim.model_sse(y, asynchronies, c(100, 100),
predict.symmetric_threshold_model)
best_fit.st
?optim
fitted.st = predict.symmetric_threshold_model(best_fit.st$par, asynchronies)
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
cost.sse(y, fitted.st) # same as best_fit$value
sqrt(mean((y-fitted.st)^2))
cor(y, fitted.st)^2
mean(abs(y-fitted.st))
yhat_at = predict.asymmetric_threshold_model(c(-200, 300, 100), asynchronies)
plot.sj(yhat_at)
best_fit.at = optim.model_sse(y, asynchronies, c(-200, 300, 100),
predict.asymmetric_threshold_model)
fitted.at = predict.asymmetric_threshold_model(best_fit.at$par, asynchronies)
plot.sj(y, type='p') # actual data
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.at, col='orange', add=TRUE)
abline(v=best_fit.st$par[1] * c(-1, 1), col='dodgerblue3', lwd=2, lty=2)
abline(v=best_fit.at$par[1:2], col='orange', lwd=2, lty=2)
cost.sse(y, fitted.st)
cost.sse(y, fitted.at)
yhat_atb = predict.asymmetric_threshold_bias_model(c(-100, 250, 120, .2), asynchronies)
yhat_at = predict.asymmetric_threshold_model(c(-100, 250, 120), asynchronies)
plot.sj(yhat_atb, main='Double Threshold w/ Bias', col='darkgreen')
plot.sj(yhat_at, add=TRUE, col='orange')
best_fit.atb = optim.model_sse(y, asynchronies, c(-200, 250, 100, .2), predict.asymmetric_threshold_bias_model)
fitted.atb = predict.asymmetric_threshold_bias_model(best_fit.atb$par, asynchronies)
plot.sj(y, type='p')
plot.sj(fitted.st, col='dodgerblue3', add=TRUE)
plot.sj(fitted.at, col='orange', add=TRUE)
plot.sj(fitted.atb, col='darkgreen', add=TRUE)
fits.st = apply(async_data, 1, optim.model_sse,
asynchronies,
c(300, 100),
predict.symmetric_threshold_model)
pars.st = sapply(fits.st, get_pars)
yhat.st = apply(pars.st, 2, predict.symmetric_threshold_model, asynchronies)
fits.at = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100),
predict.asymmetric_threshold_model)
pars.at = sapply(fits.at, get_pars)
yhat.at = apply(pars.at, 2, predict.asymmetric_threshold_model, asynchronies)
fits.atb = apply(async_data, 1, optim.model_sse,
asynchronies,
c(-200, 250, 100, .2),
predict.asymmetric_threshold_bias_model)
pars.atb = sapply(fits.atb, get_pars)
yhat.atb = apply(pars.atb, 2, predict.asymmetric_threshold_bias_model, asynchronies)
par(mfrow=c(4,4), mar=rep(1,4))
for(ii in 1:16) {
plot.sj(async_data[ii,], type='p', axes=F)
plot.sj(yhat.st[,ii], col='dodgerblue3', add=TRUE)
plot.sj(yhat.at[,ii], col='orange', add=TRUE)
plot.sj(yhat.atb[,ii], col='darkgreen', add=TRUE)
box()
}
n_trials = 12
async_counts = async_data * n_trials
bic_matrix = array(NA, c(16, 3))
for(ii in 1:16) {
bic_matrix[ii,1] = cost.BIC(async_counts[ii,], yhat.st[,ii], rep(n_trials, length(asynchronies)), n.par=2)
bic_matrix[ii,2] = cost.BIC(async_counts[ii,], yhat.at[,ii], rep(n_trials, length(asynchronies)), n.par=3)
bic_matrix[ii,3] = cost.BIC(async_counts[ii,], yhat.atb[,ii], rep(n_trials, length(asynchronies)), n.par=4)
}
dev.off()
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
bic_diff <- bic_matrix[,3] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'darkgreen', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
sum(bic_diff)
mean(bic_diff)
wilcox.test(bic_diff)
bic_diff <- bic_matrix[,1] - bic_matrix[,2]
barplot(bic_diff,
col=ifelse(bic_diff < 0, 'dodgerblue3', 'orange'),
ylab='BIC Difference', las=1, border=NA)
abline(h=0, col='lightgray')
