# Multinomial regression interpretation

**URL:** <https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731>\
**Category:** Modeling\
**Created:** [October 16, 2020, 7:08pm UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731 "2020-10-16T19:08:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![dkaplan](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/dkaplan/32/13835_2.png) [@dkaplan](https://discourse.mc-stan.org/u/dkaplan)\
**Post date:** [October 16, 2020, 7:08pm UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731/1 "2020-10-16T19:08:37Z")

</div>

Hi all,

I have a multinomial regression comparing boys and girls on a 4 point Likert response to the question “I do well in reading” (this is for a course example). Typically, in multinomial regression , the coefficient gives me the difference between boys and girls on the comparison between, say the first response and the last response. Here I am getting all of the regression coefficients, and I am not sure what they mean.

Also does anyone out there know how to code up posterior predictive checks for multinomial regression such as the code I have above? Thanks!

Thanks. David

```
       mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff

```

beta[1,1] 0.41 0.17 2.34 -4.32 -0.98 0.49 1.91 4.87 180  
beta[1,2] 0.27 0.17 2.35 -4.38 -1.07 0.31 1.76 4.91 181  
beta[1,3] -0.07 0.17 2.34 -4.67 -1.46 -0.03 1.44 4.47 181  
beta[1,4] -0.05 0.17 2.33 -4.67 -1.38 -0.05 1.50 4.51 183  
beta[2,1] 0.46 0.24 2.52 -4.56 -1.11 0.66 2.20 5.27 107  
beta[2,2] -0.06 0.24 2.52 -5.19 -1.73 0.19 1.74 4.82 107  
beta[2,3] -0.32 0.24 2.50 -5.39 -1.95 -0.09 1.34 4.36 106  
beta[2,4] -0.24 0.24 2.54 -5.28 -1.78 -0.01 1.55 4.68 109  
Rhat  
beta[1,1] 0.99  
beta[1,2] 0.99  
beta[1,3] 0.99  
beta[1,4] 0.99  
beta[2,1] 1.00  
beta[2,2] 1.00  
beta[2,3] 1.00  
beta[2,4] 1.00

---

<div class="post-metadata">

**Author:** ![andrjohns](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/andrjohns/32/15297_2.png) [@andrjohns](https://discourse.mc-stan.org/u/andrjohns)\
**Post date:** [October 17, 2020, 12:33am UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731/2 "2020-10-17T00:33:01Z")

</div>

Hi David, we’ll need a bit more information here. What Stan or brms syntax are you using to specify the regression?

---

<div class="post-metadata">

**Author:** ![dkaplan](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/dkaplan/32/13835_2.png) [@dkaplan](https://discourse.mc-stan.org/u/dkaplan)\
**Post date:** [October 17, 2020, 2:31pm UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731/3 "2020-10-17T14:31:13Z")

</div>

Of course. Here you go.

````
## Read in data ##
male: (1=male)

ASBG04: # of books in home 1) 0-10, 2) 11-25, 3) 26-100, 4) 101-200 5) More than 200

ASBGSMR: Students motivated to read (4pt, strongly agree to strongly disagree)

ASBR07A: I do well in reading

```{r, echo=TRUE}
Canadareg <-read.csv("~/desktop/Canada.csv",header=TRUE) #browse to select data "Canada.csv"
Canadareg <- Canadareg[1:5000,] # Just to cut down the sample size.
Canadareg[Canadareg==999999]=NA
Canadareg <- na.omit(Canadareg)
male <- ifelse(Canadareg$ITSEX==2,0,1)
Canadareg1 <- subset(Canadareg,select=c(ASBR07A, male, ASBG04,ASBGSMR))
Canadareg1 < data.frame(Canadareg1)

attach(Canadareg1)
N <- nrow(Canadareg1)
f <- as.formula("ASBR07A ~ male")
M <- model.matrix(f,Canadareg1)

data.list <- list(N=nrow(M), 
                  K=length(unique(Canadareg1[,1])),
                  D=ncol(M), 
                  x=M, 
                  ASBR07A=as.numeric(Canadareg1[,1]))

````

```
modelString <- "

data {
  int K; // This is 4, the number of outcomes categories
  int N;            
  int D; // This is the number of columns in the design matrix - 2
  int ASBR07A[N];
  matrix[N, D] x; // This will be N by 2 matrix of data
}

 
parameters {
  matrix[D, K] beta; // This is a 2 x 4 matrix of betas
}

model {
  matrix[N, K] x_beta = x * beta; // N x 2 * 2 x 4 

  to_vector(beta) ~ normal(0, 5);

  for (i in 1:N)
    ASBR07A[i] ~ categorical_logit(x_beta[i]');
}
}
"

```

---

<div class="post-metadata">

**Author:** ![andrjohns](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/andrjohns/32/15297_2.png) [@andrjohns](https://discourse.mc-stan.org/u/andrjohns)\
**Post date:** [October 17, 2020, 2:45pm UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731/4 "2020-10-17T14:45:00Z")

</div>

Great, thanks. Bob talked about the difference between the K and K-1 parameterisations in this stackoverflow post: [https://stackoverflow.com/a/60588946](https://stackoverflow.com/a/60588946)

And the manual section he referred to is here: [https://mc-stan.org/docs/2\_24/stan-users-guide/multi-logit-section.html#identifiability](https://mc-stan.org/docs/2_24/stan-users-guide/multi-logit-section.html#identifiability)

---

<div class="post-metadata">

**Author:** ![dkaplan](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/dkaplan/32/13835_2.png) [@dkaplan](https://discourse.mc-stan.org/u/dkaplan)\
**Post date:** [October 17, 2020, 4:03pm UTC](https://discourse.mc-stan.org/t/multinomial-regression-interpretation/18731/5 "2020-10-17T16:03:11Z")

</div>

Thanks. But without the K-1 specification are these parameters interpretable? Also, here is the Stan code with the K-1 specification as I understood it from the manual.

modelString \<- "

data {  
int K; // This is 4, the number of outcomes categories  
int N;  
int D; // This is the number of columns in the design matrix - 2  
int ASBR07A[N];  
matrix[N, D] x; // This will be N by 2 matrix of data  
}

transformed data {  
row\_vector[D] zeros = rep\_row\_vector(0, D);  
}

parameters {  
matrix[K-1, D] beta\_row; // This is a 2 x 4 matrix of betas  
}

transformed parameters {  
matrix[K, D] beta;  
beta = append\_row(beta\_row, zeros);  
}

model {  
matrix[N, K] x\_beta = x \* beta; // N x 2 \* 2 x 4

to\_vector(beta) ~ normal(0, 5);

for (i in 1:N)  
ASBR07A[i] ~ categorical\_logit(x\_beta[i]’);  
}  
}  
"

The error message I am getting is

DIAGNOSTIC(S) FROM PARSER:  
Info:  
Left-hand side of sampling statement (~) may contain a non-linear transform of a parameter or local variable.  
If it does, you need to include a target += statement with the log absolute determinant of the Jacobian of the transform.  
Left-hand-side of sampling statement:  
to\_vector(beta) ~ normal(…)

PARSER FAILED TO PARSE INPUT COMPLETELY  
STOPPED AT LINE 32:  
}

Info:  
Left-hand side of sampling statement (~) may contain a non-linear transform of a parameter or local variable.  
If it does, you need to include a target += statement with the log absolute determinant of the Jacobian of the transform.  
Left-hand-side of sampling statement:  
to\_vector(beta) ~ normal(…)

Error in stanc(file = file, model\_code = model\_code, model\_name = model\_name, :  
failed to parse Stan model ‘9c728d9cd657025c917d354127f06a32’ due to the above error.
