library(Hmisc)
library(survey)
library(data.table)
library(knitr)
library(kableExtra)

Load district survey data

# df = mdb.get("~/Downloads/SADC_2017_District.MDB", tables=c('SADCQN'))
# fwrite(df, '~/Downloads/SADCQN_2017_District.csv')
dt = fread('~/Downloads/SADCQN_2017_District.csv')
svy_qn <- svydesign(id = ~PSU, weight = ~weight, strata = ~stratum,
                               data = dt, nest = TRUE)

Verify correct use of data

Verify that I can recreate reported statistics on YRBSS website with raw data.

Will try to replicate San Diego % reported non-condom use split by whether they have had sex with same sex only, or with other sex only / both sexes. NOTE: Found that San Francisco is included on their website but not in raw data!

Screenshot of link below https://nccd.cdc.gov/Youthonline/App/Results.aspx?TT=C&OUT=0&SID=HS&QID=H64&LID=SA&YID=2017&LID2=&YID2=&COL=P&ROW1=N&ROW2=N&HT=QQ&LCT=LL&FS=S1&FR=R1&FG=G1&FA=A1&FI=I1&FP=P1&FSL=S1&FRL=R1&FGL=G1&FAL=A1&FIL=I1&FPL=P1&PV=&TST=False&C1=&C2=&QP=G&DP=1&VA=CI&CS=Y&SYID=&EYID=&SC=DEFAULT&SO=ASC

# non-use among those with opposite-sex partners only
svyciprop(~I(qn64 == 2), subset(svy_qn, year == 2017 & sexpart2 == 2 & sitename == "San Diego, CA (SA)"), na.rm=TRUE)
##                     2.5% 97.5%
## I(qn64 == 2) 0.437 0.376   0.5

Point estimate matches but CI reported on website is slightly different. Might be due to estimation method.

# non-use among those with same-sex partners
svyciprop(~I(qn64 == 2), subset(svy_qn, year == 2017 & sexpart2 == 3 & sitename == "San Diego, CA (SA)"), na.rm=TRUE)
##                     2.5% 97.5%
## I(qn64 == 2) 0.488 0.337  0.64

Point estimate matches but CI reported on website is slightly different. Might be due to estimation method.

Get sexual minority estimates by district and create tables

Self-reported gay or bisexual proportion by district

sitenames = unique(dt$sitename)
sitenames = sitenames[order(sitenames)]

get_pct_in_sitename_w_var_val = function(site, var, val, data, yr) {
  
  # break if no data
  dt = as.data.table(data$variables)[sitename == site & year == yr]
  n_responses = dt[!is.na(get(var)), .N] 
  if(n_responses == 0) {
    return(data.table(
      sitename = site,
      year = yr,
      variable = var,
      value = val,
      responses = n_responses,
      proportion = NA,
      lb = NA,
      ub = NA
    ))
  }
  
  # otherwise, get results
  res = svyciprop(as.formula(sprintf("~I(%s == %d)", var, val)), subset(data, year == yr & sitename == site), na.rm=TRUE)
  prop = unname(res[1])
  ci = unname(attr(res, "ci"))
  return(data.table(
    sitename = site,
    year = yr,
    variable = var,
    value = val,
    responses = n_responses,
    proportion = round(prop,3),
    lb = round(ci[1],3),
    ub = round(ci[2],3)
  ))
}


rbindlist(lapply(sitenames, function(x) get_pct_in_sitename_w_var_val(x, var = 'sexid2', val = 2, data = svy_qn, yr = 2017))) %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover"))
sitename year variable value responses proportion lb ub
Borough of Bronx (NYG) 2017 sexid2 2 1988 0.116 0.094 0.142
Borough of Brooklyn (NYH) 2017 sexid2 2 2823 0.093 0.082 0.106
Borough of Manhattan (NYI) 2017 sexid2 2 2348 0.125 0.099 0.155
Borough of Queens (NYJ) 2017 sexid2 2 1506 0.093 0.078 0.111
Borough of Staten Island (NYK) 2017 sexid2 2 1195 0.101 0.077 0.130
Broward County, FL (FT) 2017 sexid2 2 907 0.122 0.094 0.158
Charlotte-Mecklenburg County, NC (CM) 2017 sexid2 2 0 NA NA NA
Chicago, IL (CH) 2017 sexid2 2 1752 0.134 0.110 0.162
Dallas, TX (DA) 2017 sexid2 2 0 NA NA NA
Duval County, FL (DU) 2017 sexid2 2 3296 0.165 0.150 0.180
Fort Worth, TX (FW) 2017 sexid2 2 3251 0.100 0.089 0.111
Miami-Dade County, FL (MM) 2017 sexid2 2 2752 0.115 0.100 0.132
Milwaukee, WI (ML) 2017 sexid2 2 0 NA NA NA
New Orleans, LA (NO) 2017 sexid2 2 0 NA NA NA
New York City, NY (NYC) 2017 sexid2 2 9860 0.104 0.095 0.114
Orange County, FL (OL) 2017 sexid2 2 1321 0.122 0.102 0.145
San Bernardino, CA (SB) 2017 sexid2 2 0 NA NA NA
San Diego, CA (SA) 2017 sexid2 2 2420 0.094 0.078 0.115
Seattle, WA (SE) 2017 sexid2 2 0 NA NA NA

Self-reported proportion having sex with someone of the same sex by district

rbindlist(lapply(sitenames, function(x) get_pct_in_sitename_w_var_val(x, var = 'sexpart2', val = 3, data = svy_qn, yr = 2017))) %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover"))
sitename year variable value responses proportion lb ub
Borough of Bronx (NYG) 2017 sexpart2 3 1612 0.093 0.071 0.122
Borough of Brooklyn (NYH) 2017 sexpart2 3 2183 0.086 0.067 0.109
Borough of Manhattan (NYI) 2017 sexpart2 3 1935 0.088 0.057 0.134
Borough of Queens (NYJ) 2017 sexpart2 3 1189 0.063 0.048 0.081
Borough of Staten Island (NYK) 2017 sexpart2 3 1037 0.060 0.046 0.078
Broward County, FL (FT) 2017 sexpart2 3 836 0.112 0.085 0.147
Charlotte-Mecklenburg County, NC (CM) 2017 sexpart2 3 0 NA NA NA
Chicago, IL (CH) 2017 sexpart2 3 1587 0.093 0.073 0.118
Dallas, TX (DA) 2017 sexpart2 3 0 NA NA NA
Duval County, FL (DU) 2017 sexpart2 3 2908 0.156 0.141 0.173
Fort Worth, TX (FW) 2017 sexpart2 3 2983 0.068 0.058 0.080
Miami-Dade County, FL (MM) 2017 sexpart2 3 2552 0.098 0.084 0.114
Milwaukee, WI (ML) 2017 sexpart2 3 0 NA NA NA
New Orleans, LA (NO) 2017 sexpart2 3 0 NA NA NA
New York City, NY (NYC) 2017 sexpart2 3 7956 0.079 0.069 0.092
Orange County, FL (OL) 2017 sexpart2 3 1217 0.098 0.080 0.120
San Bernardino, CA (SB) 2017 sexpart2 3 0 NA NA NA
San Diego, CA (SA) 2017 sexpart2 3 2293 0.078 0.064 0.096
Seattle, WA (SE) 2017 sexpart2 3 0 NA NA NA

Self-reported transgender identity by district

rbindlist(lapply(sitenames, function(x) get_pct_in_sitename_w_var_val(x, var = 'qntransgender', val = 1, data = svy_qn, yr = 2017))) %>% kable() %>% kable_styling(bootstrap_options = c("striped", "hover"))
sitename year variable value responses proportion lb ub
Borough of Bronx (NYG) 2017 qntransgender 1 1985 0.016 0.010 0.026
Borough of Brooklyn (NYH) 2017 qntransgender 1 2828 0.017 0.010 0.030
Borough of Manhattan (NYI) 2017 qntransgender 1 2361 0.012 0.008 0.019
Borough of Queens (NYJ) 2017 qntransgender 1 1507 0.015 0.009 0.023
Borough of Staten Island (NYK) 2017 qntransgender 1 1190 0.016 0.009 0.030
Broward County, FL (FT) 2017 qntransgender 1 888 0.033 0.019 0.057
Charlotte-Mecklenburg County, NC (CM) 2017 qntransgender 1 0 NA NA NA
Chicago, IL (CH) 2017 qntransgender 1 0 NA NA NA
Dallas, TX (DA) 2017 qntransgender 1 0 NA NA NA
Duval County, FL (DU) 2017 qntransgender 1 0 NA NA NA
Fort Worth, TX (FW) 2017 qntransgender 1 0 NA NA NA
Miami-Dade County, FL (MM) 2017 qntransgender 1 0 NA NA NA
Milwaukee, WI (ML) 2017 qntransgender 1 0 NA NA NA
New Orleans, LA (NO) 2017 qntransgender 1 0 NA NA NA
New York City, NY (NYC) 2017 qntransgender 1 9871 0.015 0.012 0.019
Orange County, FL (OL) 2017 qntransgender 1 0 NA NA NA
San Bernardino, CA (SB) 2017 qntransgender 1 0 NA NA NA
San Diego, CA (SA) 2017 qntransgender 1 2432 0.012 0.007 0.019
Seattle, WA (SE) 2017 qntransgender 1 0 NA NA NA

Districts with self-reported gay or bisexual data before 2017

sort(dt[year<2017 & !is.na(sexid2), unique(sitename)])
##  [1] "Borough of Bronx (NYG)"               
##  [2] "Borough of Brooklyn (NYH)"            
##  [3] "Borough of Manhattan (NYI)"           
##  [4] "Borough of Queens (NYJ)"              
##  [5] "Borough of Staten Island (NYK)"       
##  [6] "Broward County, FL (FT)"              
##  [7] "Charlotte-Mecklenburg County, NC (CM)"
##  [8] "Chicago, IL (CH)"                     
##  [9] "Duval County, FL (DU)"                
## [10] "Fort Worth, TX (FW)"                  
## [11] "Miami-Dade County, FL (MM)"           
## [12] "Milwaukee, WI (ML)"                   
## [13] "New York City, NY (NYC)"              
## [14] "Orange County, FL (OL)"               
## [15] "San Bernardino, CA (SB)"              
## [16] "San Diego, CA (SA)"                   
## [17] "Seattle, WA (SE)"

Districts with same-sex sexual contacts data before 2017

sort(dt[year<2017 & !is.na(sexpart2), unique(sitename)])
##  [1] "Borough of Bronx (NYG)"         "Borough of Brooklyn (NYH)"     
##  [3] "Borough of Manhattan (NYI)"     "Borough of Queens (NYJ)"       
##  [5] "Borough of Staten Island (NYK)" "Broward County, FL (FT)"       
##  [7] "Chicago, IL (CH)"               "Duval County, FL (DU)"         
##  [9] "Fort Worth, TX (FW)"            "Miami-Dade County, FL (MM)"    
## [11] "Milwaukee, WI (ML)"             "New York City, NY (NYC)"       
## [13] "Orange County, FL (OL)"         "San Diego, CA (SA)"            
## [15] "Seattle, WA (SE)"