Blundering Ecologist Blundering Ecologist - 15 days ago 9
R Question

Number of dimensions for p-value using stargazer

Another user asked How do I add confidence intervals to odds ratios in stargazer table? and outlined their solution to the problem (I've included the relevant lines of code here)

OR.vector <- exp(mylogit$coef)
CI.vector <- exp(confint(mylogit))
p.values <- summary(mylogit)$coefficients[, 4]

# Table with ORs and CIs`
stargazer(mylogit, coef = list(OR.vector), ci = T,
ci.custom = list(CI.vector), p = list(p.values),
single.row = T, type = "text")


When I try to run the same code for my own model, I receive the following error

Error in summary(ml.TatC)$coefficients[, 4] :
incorrect number of dimensions


Might anyone know why this is happening? Thank you in advance for your help!

UPDATE: Here is a link to the .txt file used.

The code I have used is as follows:

tattoo <- read.table("https://ndownloader.figshare.com/files/6920972",
header=TRUE, na.strings=c("unk", "NA"))

library(mlogit)

Tat<-mlogit.data(tattoo, varying=NULL, shape="wide", choice="size", id.var="date")

ml.Tat<-mlogit(size~1|age+sex+yy, Tat, reflevel="small", id.var="date")

library(stargazer)

OR.vector<-exp(ml.Tat$coef)
CI.vector<-exp(confint(ml.Tat))
p.values<-summary(ml.Tat)$coefficients[,4] #incorrect # of dimensions, how am I supposed to determine dimensions?

stargazer(ml.Tat, coef=list(OR.vector), ci=TRUE, ci.custom=list(CI.vector), single.row=T, type="text", star.cutoffs=c(0.05,0.01,0.001), out="table1.txt", digits=4)

Answer

The mlogit package stores p-values through the function summary.mlogit in $CoefTable, not in $coefficients, as with summary.glm. You can see this:

> str(summary(ml.Tat)$coefficients)
atomic [1:8] -4.45e+02 -1.88e+02 2.51e-02 8.04e-03 1.38 ...

summary(ml.Tat)$coefficients is an atomic vector, so has only one dimension. That's why you are getting the error.

Use summary(ml.Tat)$CoefTable[,4] to extract the p-values you want:

> summary(ml.Tat)$CoefTable[,4]
  large:(intercept) medium:(intercept)   large:age         medium:age          large:sexM        medium:sexM 
  0.000000e+00       0.000000e+00       8.536121e-10       1.731441e-03       0.000000e+00       0.000000e+00 
  large:yy          medium:yy 
  0.000000e+00       0.000000e+00 

So your code should read:

library(stargazer)

OR.vector<-exp(ml.Tat$coef)
CI.vector<-exp(confint(ml.Tat))
p.values<-summary(ml.Tat)$CoefTable[,4]

stargazer(ml.Tat, coef=list(OR.vector), ci=TRUE, ci.custom=list(CI.vector),
          p = p.values, single.row=T, type="text",
          star.cutoffs=c(0.05,0.01,0.001), 
          out="table1.txt", digits=4)

Your table:

================================================
                        Dependent variable:     
                   -----------------------------
                               size             
------------------------------------------------
large:(intercept)   0.0000*** (0.0000, 0.0000)  
medium:(intercept)    0.0000 (0.0000, 0.0000)   
large:age             1.0254 (1.0172, 1.0336)   
medium:age            1.0081 (1.0030, 1.0132)   
large:sexM            3.9821 (3.5355, 4.4851)   
medium:sexM           2.0886 (1.9576, 2.2284)   
large:yy              1.2455 (1.2189, 1.2726)   
medium:yy             1.0976 (1.0849, 1.1105)   
------------------------------------------------
Observations                  18,162            
R2                            0.0410            
Log Likelihood             -15,882.7000         
LR Test               1,357.1140*** (df = 8)    
================================================
Note:              *p<0.05; **p<0.01; ***p<0.001

Good to know (if you are new to R) that packages deploy the summary function differently, so always good to explore the object to see what is going on.

Comments