I am building an ordered logistic model with three categories. (Trees in phenological states determined by forcing temperatures). I would like to model the difference between cutpoints with effects from different clusters in my data.
I’ve created the transformed parameter
cdiff = cutpoints[2]-cutpoints[1];
and put a prior on that parameter.
alpha ~ lognormal(1,1);
cdiff ~ gamma(alpha, 1); // difference between first and second cutpoint
I can include the difference between cutpoints, but I can’t figure out how to include the clusters in the difference.
Some of the clusters are crossed and others are nested. (It’s a messy common garden design). Clones are represented by individual trees, which are male or female. Clones have a provenance. Provenances and clones are both represented at multiple sites, but an individual tree can obviously only occur at one site).
What I’d like to do is something like
alpha = \alpha + \alpha_{site} + \alpha_{provenance} +\alpha_{clone\ in\ provenance} + \alpha_{year}
I am new to stan and can’t figure out how to add effects to the difference between cutpoints.
Here is a working version for simulated data with no groups.
Simulate data in R and run model
cuts <- c(15,20)
beta <- 0.05
forcing <- runif(300, 175, 500) #
eta <- beta * forcing
state <- rordlogit(length(eta), phi = eta, a = cuts)
sim <- data.frame(forcing,state)
K = length(unique(sim$state))
N = nrow(sim)
stan_rdump(c("N", "K", "forcing", "state"), "simulated_nogroups.Rdump")
simplesimdat <- read_rdump("simulated_nogroups.Rdump")
simfit <- stan("cutpoints_difference.stan",
chains=5, cores=5, iter=2000,
data=simplesimdat)
Stan code
data{
int N; //number of observations
int K; //number of possible states
int state[N];
vector[N] forcing; //predictor
}
parameters{
positive_ordered[K-1] cutpoints;
real<lower=0,upper=1> beta; // eta "slope"
real<lower=0> alpha;
}
transformed parameters {
//declare params
vector[K-1] h50; // transition points on forcing scale
real<lower=0> cdiff; //difference between cutpoints
//define params
for ( i in 1:2 ) {
h50[i] = cutpoints[i]/beta;
}
cdiff = cutpoints[2]-cutpoints[1];
}
model{
//declarations
vector[N] eta;
//priors
//for eta
beta ~ beta( 0.5 , 5 );
//for cutpoints
cutpoints[1] ~ exponential(0.3); // don't let first cutpoint get too big for its britches
alpha ~ lognormal(1,1);
cdiff ~ gamma(alpha, 1); // difference between first and second cutpoint
//model
for ( i in 1:N ) {
eta[i] = beta * forcing[i];
}
state ~ ordered_logistic( eta , cutpoints );
}
I’m not actually interested in the cutpoints, I’m interested in the point at which half of the trees have transitioned from one state to another (h50
), defined in the transformed parameters as cutpoints/beta
.
I am trying to use the difference between because I believe that some effects should shift the h50
in different directions. If I include the effects in eta
, then h50
can only be shifted in one direction by an effect for both transitions.
I am also open to adding effects to both cutpoints. I tried to include effects on each cutpoint individually based on this question. However I couldn’t figure out how to include multiple clusters and was only able to include one cluster.
Is it possible to add effects to the difference between cutpoints? How can I do this?