model_code <- "data{ int<lower = 0> N; // number of observations real y[N]; // y
int<lower = 0> speaker[N]; // speaker index int<lower = 0> word[N]; // word index
int<lower = 0> context[N]; // context index int<lower = 0> max_context; // max context
int<lower = 0> max_speaker; // number of speakers int<lower = 0> dob[max_speaker]; // by speaker dob int<lower = 0> sex[max_speaker]; // by speaker sex int<lower = 0> max_sex; // max sex int<lower = 0> n_bspline; // number of b-spline knots int<lower = 0> max_dob; // max_dob matrix[max_dob, n_bspline] b_spline; // bsplines int<lower = 0> max_word; // max word}parameters{ vector[n_bspline] b_coefs; // bspline coefs for sex==1, context==1 vector[n_bspline] male_b_coefs; // bspline coefs for sex==2, context==1 vector[n_bspline] c2_b_coefs; // bspline coefs for sex==1, context==2 vector[n_bspline] c2_male_b_coefs; // bspline coefs for sex==2, context==2
matrix[max_speaker, max_context] speaker_mu; // by-speaker mu real<lower = 0> speaker_sigma[max_speaker]; // by-speaker sigma
real<lower = 0> sigma; // sigma for distribution of speaker_mu real intercept; // intercept for speaker_mu real male_effect; // male effect for speaker_mu real context_effect; // context effect for speaker_mu
real word_mu[max_word]; // by-word mu real<lower = 0> words_sigma; // sigma for distribution of word_mu}transformed parameters{ // delta[i] = diff in y from dob==i-1 to dob==i vector[max_dob] delta; // delta for for sex==1, context==1 vector[max_dob] male_delta; // delta for for sex==2, context==1 vector[max_dob] c2_delta; // delta for for sex==1, context==2 vector[max_dob] c2_male_delta; // delta for for sex==2, context==2
// Delta = total displacement from dob==1 real Delta[max_dob, max_sex, max_context];
// mu for intercept prior real likely_start;
// calculate deltas delta <- b_spline * b_coefs; male_delta <- b_spline * male_b_coefs;
c2_delta <- b_spline * c2_b_coefs; c2_male_delta <- b_spline * c2_male_b_coefs;
// This whole block is basicaly cumsum(delta[1:i]) Delta[1,1,1] <- delta[1]; Delta[1,1,2] <- delta[1] + c2_delta[1]; Delta[1,2,1] <- delta[1] + male_delta[1]; Delta[1,2,2] <- delta[1] + c2_delta[1] + male_delta[1] + c2_male_delta[1];
for(i in 2:max_dob){ Delta[i,1,1] <- Delta[i-1,1,1] + delta[i]; Delta[i,1,2] <- Delta[i-1,1,2] + delta[i] + c2_delta[i]; Delta[i,2,1] <- Delta[i-1,2,1] + delta[i] + male_delta[i]; Delta[i,2,2] <- Delta[i-1,2,2] + delta[i] + c2_delta[i] + male_delta[i] + c2_male_delta[i];
} //end cumsum
// Set mu for intercept prior to sample mean likely_start <- mean(y);}model{
// sigma prior as suggested by Stan reference words_sigma ~ cauchy(0, 2.5) T[0,]; // sigma for distribution of word effects for(i in 1:max_word){ word_mu[i] ~ normal(0, words_sigma); // word effect } // Calculate a mu for every speaker for each context for(i in 1:max_speaker){ for(j in 1:max_context){ speaker_mu[i,j] ~ normal(Delta[dob[i],sex[i],j] + (male_effect * (sex[i]-1)) + (context_effect * (j-1)) + intercept, sigma); } // Each speaker can have a different sigma for their data. speaker_sigma[i] ~ cauchy(0, 2.5) T[0,]; }
// priors for parameters in speaker_mu estimate intercept ~ normal(likely_start, 100); male_effect ~ normal(0, 100); context_effect ~ normal(0,100); // b_coefs for(i in 1:n_bspline){ b_coefs[i] ~ normal(0, 100); male_b_coefs[i] ~ normal(0, 100); c2_b_coefs[i] ~ normal(0, 100); c2_male_b_coefs[i] ~ normal(0, 100); }
// data loop // mu = speaker_mu + word_mu // sigma = speaker_sigma for(i in 1:N){ y[i] ~ normal(speaker_mu[speaker[i], context[i]] + word_mu[word[i]], speaker_sigma[speaker[i]]);
}}"load("data.Rdata")library(rstan)library(splines)library(plyr)
spinfo <- unique(data[,c("NSpeaker","DOB1","NSex")])spinfo <- arrange(spinfo, NSpeaker)
b_spline <- cbind(1, bs(1:max(spinfo$DOB1), df = 3))
dat <- list( N = nrow(data), y = data$F1.n, speaker = data$NSpeaker, word = data$NWord, context = data$NContext, max_context = max(data$NContext), max_speaker = max(data$NSpeaker), dob = spinfo$DOB1, sex = spinfo$NSex, max_sex = max(spinfo$NSex), n_bspline = ncol(b_spline), max_dob = max(spinfo$DOB1), b_spline = b_spline, max_word = max(data$NWord))
model <- stan(fit = mod_init, data = dat, iter = 1000, chains = 3)> sessionInfo()R version 2.15.1 (2012-06-22)Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:[1] graphics grDevices utils datasets stats methods base
other attached packages:[1] ggplot2_0.9.1
loaded via a namespace (and not attached): [1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.15.1 [5] labeling_0.1 MASS_7.3-18 memoise_0.1 munsell_0.3 [9] plyr_1.7.1 proto_0.3-9.2 RColorBrewer_1.0-5 reshape2_1.2.1 [13] scales_0.2.1 stringr_0.6
for(i in 1:max_word){ word_mu[i] ~ normal(0, words_sigma); // word effect }
and
// b_coefs
for(i in 1:n_bspline){ b_coefs[i] ~ normal(0, 100); male_b_coefs[i] ~ normal(0, 100); c2_b_coefs[i] ~ normal(0, 100);
c2_male_b_coefs[i] ~ normal(0, 100); }
// This whole block is basicaly cumsum(delta[1:i]) Delta[1,1,1] <- delta[1]; Delta[1,1,2] <- delta[1] + c2_delta[1]; Delta[1,2,1] <- delta[1] + male_delta[1]; Delta[1,2,2] <- delta[1] + c2_delta[1] + male_delta[1] + c2_male_delta[1];
for(i in 2:max_dob){ Delta[i,1,1] <- Delta[i-1,1,1] + delta[i]; Delta[i,1,2] <- Delta[i-1,1,2] + delta[i] + c2_delta[i];
Delta[i,2,1] <- Delta[i-1,2,1] + delta[i] + male_delta[i]; Delta[i,2,2] <- Delta[i-1,2,2] + delta[i] + c2_delta[i] + male_delta[i] + c2_male_delta[i];
} //end cumsum
for(i in 1:max_dob){
t0 <- sum(delta[1:i]);
t1 <- sum(c2_delta[1:i]);
t2 <- sum(male_delta[1:i]);Delta[i,1,1] <- t0;Delta[i,1,2] <- t0 + t1;Delta[i,2,1] <- t0 + t2;Delta[i,2,2] <- Delta[i,1,2] + t2 + sum(c2_male_delta[1:i]);
}
> stanc(model_code = model_code)
TRANSLATING MODEL 'model_code' FROM Stan CODE TO C++ CODE NOW.
Error in stanc(model_code = model_code) : c++ exception (unknown reason)
model_code <- "data{ int<lower = 0> N; // number of observations real y[N]; // y int<lower = 0> speaker[N]; // speaker index int<lower = 0> word[N]; // word index
int<lower = 0> context[N]; // context index int<lower = 0> max_context; // max context
int<lower = 0> max_speaker; // number of speakers int<lower = 0> dob[max_speaker]; // by speaker dob int<lower = 0> sex[max_speaker]; // by speaker sex int<lower = 0> max_sex; // max sex int<lower = 0> n_bspline; // number of b-spline knots int<lower = 0> max_dob; // dob index
matrix[max_dob, n_bspline] b_spline; // bsplines int<lower = 0> max_word;}parameters{ vector[n_bspline] b_coefs; vector[n_bspline] male_b_coefs; vector[n_bspline] c2_b_coefs; vector[n_bspline] c2_male_b_coefs; real<lower = 0> sigma; real intercept;
real male_effect;
matrix[max_speaker, max_context] speaker_mu; real<lower = 0> speaker_sigma[max_speaker]; real word_mu[max_word]; real<lower = 0> words_sigma; real context_effect;}transformed parameters{ vector[max_dob] delta; vector[max_dob] male_delta; vector[max_dob] c2_delta; vector[max_dob] c2_male_delta;
real Delta[max_dob, max_sex, max_context]; real likely_start; delta <- b_spline * b_coefs; male_delta <- b_spline * male_b_coefs;
c2_delta <- b_spline * c2_b_coefs; c2_male_delta <- b_spline * c2_male_b_coefs;
for(i in 1:max_dob){ Delta[i,1,1] <- sum(delta[1:i]); Delta[i,1,2] <- sum(c2_delta[1:i]); Delta[i,2,1] <- sum(male_delta[1:i]); Delta[i,2,2] <- sum(c2_male_delta[1:i]); }
//Delta[1,1,1] <- delta[1]; //Delta[1,1,2] <- delta[1] + c2_delta[1]; //Delta[1,2,1] <- delta[1] + male_delta[1]; //Delta[1,2,2] <- delta[1] + c2_delta[1] + male_delta[1] + c2_male_delta[1]; // //for(i in 2:max_dob){ // Delta[i,1,1] <- Delta[i-1,1,1] + delta[i]; // Delta[i,1,2] <- Delta[i-1,1,2] + delta[i] + c2_delta[i]; // Delta[i,2,1] <- Delta[i-1,2,1] + delta[i] + male_delta[i]; // Delta[i,2,2] <- Delta[i-1,2,2] + delta[i] + c2_delta[i] + male_delta[i] + c2_male_delta[i]; //}
likely_start <- mean(y);}model{ words_sigma ~ cauchy(0, 2.5) T[0,]; word_mu ~ normal(0, words_sigma); for(i in 1:max_speaker){ for(j in 1:max_context){ speaker_mu[i,j] ~ normal(Delta[dob[i],sex[i],j] + (male_effect * (sex[i]-1)) + (context_effect * (j-1)) + intercept, sigma); } speaker_sigma[i] ~ cauchy(0, 2.5) T[0,]; }
intercept ~ normal(likely_start, 100); male_effect ~ normal(0, 100); context_effect ~ normal(0,100);
b_coefs ~ normal(0, 100); male_b_coefs ~ normal(0, 100); c2_b_coefs ~ normal(0, 100); c2_male_b_coefs ~ normal(0, 100);
for(i in 1:N){ y[i] ~ normal(speaker_mu[speaker[i], context[i]] + word_mu[word[i]], speaker_sigma[speaker[i]]); }}"
79,246 observations). Words are nested within speakers, and the context effects vary between words, so I think what I'll do is summarise mean(y) for words within speakers, giving me 12,844 observations.
-Joe
for(i in 1:N){
y[i] ~ normal(speaker_mu[speaker[i], context[i]] + word_mu[word[i]], speaker_sigma[speaker[i]]); } real predix2[N]; real speaker_sigma_v[N]; for(i in 1:N){ predix2[i] <- speaker_mu[speaker[i], context[i]] + word_mu[word[i]]; speaker_sigma_v[i] <- speaker_sigma[speaker[i]]; //y[i] ~ normal(speaker_mu[speaker[i], context[i]] + word_mu[word[i]], speaker_sigma[speaker[i]]); } y ~ normal(predix2, speaker_sigma_v);I'd tell you my C++ version, but I'm afraid I'm a bit too amateurish to do that. I'm running OSX 10.8, and I have whatever XCode 4.4.1 installs.
g++ --version
Error in stanc(file = file, model_code = model_code, model_name = model_name, : c++ exception (unknown reason)> fx()
Error in fx() : domain error with error message: a fake one
> sessionInfo()R version 2.15.1 (2012-06-22)Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:[1] graphics grDevices utils datasets stats methods base
other attached packages:[1] ggplot2_0.9.1
loaded via a namespace (and not attached): [1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.15.1 labeling_0.1 MASS_7.3-18 memoise_0.1 [8] munsell_0.3 plyr_1.7.1 proto_0.3-9.2 RColorBrewer_1.0-5 reshape2_1.2.1 scales_0.2.1 stringr_0.6 > library(Rcpp)> library(inline)> > src <- 'throw std::domain_error("domain error with error message: a fake one");' > fx <- cxxfunction(body = src, plugin = 'Rcpp', verbose = TRUE) >> setting environment variables: PKG_LIBS = /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64/libRcpp.a
>> LinkingTo : RcppCLINK_CPPFLAGS = -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"
>> Program source :
1 : 2 : // includes from the plugin 3 : 4 : #include <Rcpp.h> 5 : 6 : 7 : #ifndef BEGIN_RCPP 8 : #define BEGIN_RCPP 9 : #endif 10 : 11 : #ifndef END_RCPP 12 : #define END_RCPP 13 : #endif 14 : 15 : using namespace Rcpp; 16 : 17 : 18 : // user includes 19 : 20 : 21 : // declarations 22 : extern "C" { 23 : SEXP file739f60f567f5( ) ; 24 : } 25 : 26 : // definition 27 : 28 : SEXP file739f60f567f5( ){ 29 : BEGIN_RCPP 30 : throw std::domain_error("domain error with error message: a fake one"); 31 : END_RCPP 32 : } 33 : 34 : Compilation argument: /Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file739f60f567f5.cpp 2> file739f60f567f5.cpp.err.txt g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG -I/usr/local/include -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include" -fPIC -g -O3 -c file739f60f567f5.cpp -o file739f60f567f5.og++ -arch x86_64 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o file739f60f567f5.so file739f60f567f5.o /Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64/libRcpp.a -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation> fx()Error in fx() : c++ exception (unknown reason)
> packageVersion("Rcpp")
[1] ‘0.9.13’