PUMS ACS codebook and the mysterious "b" code

Does anyone know how the Census assigns the PUMS codebook value "b" code to a text value in the downloaded (API) data?

I was looking at the LNGI "Limited English speaking household" PUMS variable.  When you fetch PUMS data via the API the variable values are text fields.

It turns out that for LNGI the "b" in the codebook corresponds to the text string (in the sense of a SAS format)   "b .N/A (GQ/vacant)"   data value "0"

In the LNGI case,the PUMS data field contains the value "0" which it turns means N/A (GQ/vacant). You can guess this because there are no " " fields in the PUMS data and "0" value doesn't appear in the codebook.  By doing a little detective work using the codebook and some downloaded data you can figure this out.  However, "0" isn't used for the "b" in the code book for all variables because sometimes  "0" is a valid non-missing value (i.e. not N/A).

When I asked the people at ACSO they sent me a SAS format statement for LNGI which makes everything clear in the case of this one variable.  But wouldn't it be nice if the Census published their PUMS SAS format catalog so we don't have to keep guessing what data value corresponds to "N/A"  Do people have another way to find out what data value corresponds to "b" in the codebook?  Some PUMS variables have over 100 coded values.   If I'm working late on Friday, do I have to wait until Monday to get an answer ?  How about a holiday weekend ?

Any help appreciated.

Dave Dorer

Parents
  • Hi Dave!

    The API does not handle 'blank' as a value, so in the processing of the data into the data API format those blank values get assigned to a new value. This new value is typically the variable's minimum value minus 1, for numeric fields. For character fields they may get stored as an 'N'. The best way to know how the values are defined for the API is to use the API discovery documentation (for info on this, see https://www.census.gov/data/developers/updates/new-discovery-tool.html).
     
    For example, for the ACS 1-Year 2021 PUMS file, you can look here: https://api.census.gov/data/2021/acs/acs1/pums.html and go the the 'variables' link.
    This brings you to a page listing every available item, an each item name is clickable to take you to the definition of the item and its values.
    Thank you!
    -Amanda
  • Dear Amanda,

    Thank You,

    I'm writing an R program to read/decode

    https://api.census.gov/data.json

    I'll post how things go !

    Professional, intelligent, prompt and detailed !

    I expect that PUMS users will find this post useful,

    Thank you again.

    Dave

  • Thank you, please do keep us posted! We will have some opportunities coming for data users to share the scripts they create!

  • For those of you who know R and who want to look up the code/label for a single PUMS variable here is some code that uses the "metadata" api 

    you need "jsonlite"

    install.packages("jsonlite") to install

    The blog interface messes up the R code paste with the url .

    replace H-T-T-P-S with https.

    # Example Call: gpcv<-get.pums.codebook.variable("PERNP",vintage=2020,period=5,debug=1)

    get.pums.codebook.variable<-function(vname="LNGI",vintage="2021",period="1",debug=0) {
    vname<-toupper(vname);

    url<-paste("h-t-t-p-s://api.census.gov/data/",vintage,"/acs/acs",period,"/pums/variables.json",sep="");

    if(debug) cat("get.pums.codebook.variable: url=\n",url,"\n",sep="");
    require("jsonlite");
    r<-try(jsonlite::fromJSON(url));
    if(class(r)[1]=="try-error") {
    cat("get.pums.codebook.variable: Download error: url=\n",url,"\n",sep="");
    return(2);
    }; # if class

    variables<-r$variables;
    nmv<-toupper(names(variables));
    m<-match(vname,nmv);
    if(any(is.na(m))) {cat("get.pums.codebook.variable: ERROR variable: ",vname,"not matched.\n");return(1);};
    vm<-variables[[nmv[m]]];
    val<-vm[["values"]];
    items<-val[["item"]];
    nmi<-names(items);
    cb<-NULL;
    M<-length(nmi);
    if(M>0) {
    lab<-rep("",M);
    for(j in seq(1,M)) {
    lab[j]<-items[[j]];
    }; # for j
    cb<-data.frame(code=nmi,value=lab);
    }; # # M > 0
    rng<-val[["range"]];
    invisible(list(variable=vname,label=vm$label,codes=cb,range=rng,type=vm$predicateType));
    }; # get.pums.codebook.variable

    Enjoy

    If you want to contact me with comments or bug reports:

      info@dorerfoundation.org

    Note this was updated 12-21-2022 at 3:47 pm EST

    Note I've found 2 bug so far..  If you downloaded earlier, please update.

    Dave

Reply
  • For those of you who know R and who want to look up the code/label for a single PUMS variable here is some code that uses the "metadata" api 

    you need "jsonlite"

    install.packages("jsonlite") to install

    The blog interface messes up the R code paste with the url .

    replace H-T-T-P-S with https.

    # Example Call: gpcv<-get.pums.codebook.variable("PERNP",vintage=2020,period=5,debug=1)

    get.pums.codebook.variable<-function(vname="LNGI",vintage="2021",period="1",debug=0) {
    vname<-toupper(vname);

    url<-paste("h-t-t-p-s://api.census.gov/data/",vintage,"/acs/acs",period,"/pums/variables.json",sep="");

    if(debug) cat("get.pums.codebook.variable: url=\n",url,"\n",sep="");
    require("jsonlite");
    r<-try(jsonlite::fromJSON(url));
    if(class(r)[1]=="try-error") {
    cat("get.pums.codebook.variable: Download error: url=\n",url,"\n",sep="");
    return(2);
    }; # if class

    variables<-r$variables;
    nmv<-toupper(names(variables));
    m<-match(vname,nmv);
    if(any(is.na(m))) {cat("get.pums.codebook.variable: ERROR variable: ",vname,"not matched.\n");return(1);};
    vm<-variables[[nmv[m]]];
    val<-vm[["values"]];
    items<-val[["item"]];
    nmi<-names(items);
    cb<-NULL;
    M<-length(nmi);
    if(M>0) {
    lab<-rep("",M);
    for(j in seq(1,M)) {
    lab[j]<-items[[j]];
    }; # for j
    cb<-data.frame(code=nmi,value=lab);
    }; # # M > 0
    rng<-val[["range"]];
    invisible(list(variable=vname,label=vm$label,codes=cb,range=rng,type=vm$predicateType));
    }; # get.pums.codebook.variable

    Enjoy

    If you want to contact me with comments or bug reports:

      info@dorerfoundation.org

    Note this was updated 12-21-2022 at 3:47 pm EST

    Note I've found 2 bug so far..  If you downloaded earlier, please update.

    Dave

Children
No Data