Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • creating a table with mean plus/minus SD in each cell

    Hello! I'm using Stata 14.1 on Windows. I am creating a table that has mean plus/minus standard deviation for several different variables. The variables are mean scores for Likert scale surveys. Each question is scored from 0-100 (0, 25,50, 75, or 100), and a participant's survey score is the mean of their responses to each question. The table will have a mean and SD of each participant's survey score. I can generate those values fine with -summary- or -collapse-, but getting those values into a table (with mean and SD in the same cell) eludes me—so far I’ve been copying from Stata into Word by hand. I've tried a few ways (like using -matrix-, or using r() to call stored results) but haven't gotten any to work.

    My data is confidential so I generated fake data in Stata using rnormal (mean 73, SD 15). Here's a sample of the generated data, let me know if there's a better way to upload it:
    Click image for larger version

Name:	fake data.PNG
Views:	1
Size:	7.1 KB
ID:	1617616



    I tried using the estout package:
    Code:
    estpost summarize pql_c_total_mean_wk0 pql_c_pf_mean_wk0 pql_c_ef_mean_wk0 pql_c_sf_mean_wk0 pql_c_sch_mean_wk0 qol_c_total_mean_wk0 qol_c_self_mean_wk0 qol_c_soc_mean_wk0 qol_c_env_mean_wk0 ///
        pql_c_total_mean_wk21 pql_c_pf_mean_wk21 pql_c_ef_mean_wk21 pql_c_sf_mean_wk21 pql_c_sch_mean_wk21 qol_c_total_mean_wk21 qol_c_self_mean_wk21 qol_c_soc_mean_wk21 qol_c_env_mean_wk21 ///
        pql_c_total_mean_6m pql_c_pf_mean_6m pql_c_ef_mean_6m pql_c_sf_mean_6m pql_c_sch_mean_6m qol_c_total_mean_6m qol_c_self_mean_6m qol_c_soc_mean_6m qol_c_env_mean_6m // gen table with mean and sd
    eststo summstats
    esttab summstats using "X:\Mark\Writing\Output\table3.csv", replace main(mean %6.1f) aux(sd %6.1f) noparentheses
    but the resulting excel file has a bunch of blank space and would require a lot of copy/pasting and doesn't have the plus/minus symbol. Additionally, numbers are actually formulas: ="17.3" instead of 17.3.
    Click image for larger version

Name:	esttab output.PNG
Views:	4
Size:	3.2 KB
ID:	1617612


    I also tried using collapse: my plan was to use the concatenate function in excel to concatenate the mean, plus/minus symbol, and the SD, then paste into word.
    Code:
    preserve
    collapse (mean) pql_c_total_mean_wk0 pql_c_pf_mean_wk0 pql_c_ef_mean_wk0 pql_c_sf_mean_wk0 pql_c_sch_mean_wk0 qol_c_total_mean_wk0 qol_c_self_mean_wk0 qol_c_soc_mean_wk0 qol_c_env_mean_wk0 ///
        pql_c_total_mean_wk21 pql_c_pf_mean_wk21 pql_c_ef_mean_wk21 pql_c_sf_mean_wk21 pql_c_sch_mean_wk21 qol_c_total_mean_wk21 qol_c_self_mean_wk21 qol_c_soc_mean_wk21 qol_c_env_mean_wk21 ///
        pql_c_total_mean_6m pql_c_pf_mean_6m pql_c_ef_mean_6m pql_c_sf_mean_6m pql_c_sch_mean_6m qol_c_total_mean_6m qol_c_self_mean_6m qol_c_soc_mean_6m qol_c_env_mean_6m
    ds
    foreach var in `r(varlist)' {
        replace `var' = round(`var', 0.1)
    }
    export excel using "\\childrens\research\nik\Mark\Writing\Output\table3.xlsx", sheet(mean) sheetreplace
    restore
    
    preserve
    collapse (sd) pql_c_total_mean_wk0 pql_c_pf_mean_wk0 pql_c_ef_mean_wk0 pql_c_sf_mean_wk0 pql_c_sch_mean_wk0 qol_c_total_mean_wk0 qol_c_self_mean_wk0 qol_c_soc_mean_wk0 qol_c_env_mean_wk0 ///
        pql_c_total_mean_wk21 pql_c_pf_mean_wk21 pql_c_ef_mean_wk21 pql_c_sf_mean_wk21 pql_c_sch_mean_wk21 qol_c_total_mean_wk21 qol_c_self_mean_wk21 qol_c_soc_mean_wk21 qol_c_env_mean_wk21 ///
        pql_c_total_mean_6m pql_c_pf_mean_6m pql_c_ef_mean_6m pql_c_sf_mean_6m pql_c_sch_mean_6m qol_c_total_mean_6m qol_c_self_mean_6m qol_c_soc_mean_6m qol_c_env_mean_6m
    ds
    foreach var in `r(varlist)' {
        replace `var' = round(`var', 0.1)
    }
    export excel using "\\childrens\research\nik\Mark\Writing\Output\table3.xlsx", sheet(sd) sheetreplace
    restore
    The exported excel file had too many decimals, so I tried using -round- but the excel file still went to 13 decimals. I used -round- then -tostring-, which worked in Stata but the excel file had what I think is a floating point error (e.g. number is 72.80000305 instead of 72.8). Next I tried to change the collapsed variables from float to int using -recast-:
    Code:
    ds
    foreach var in `r(varlist)' {
        recast int `var'
    }
    but the output said "1 value would be changed; not changed".

    Here's an example of the table I'm going for, with fake means/SDs:
    Click image for larger version

Name:	table with fake data.PNG
Views:	1
Size:	4.1 KB
ID:	1617613


    I first used collapse to generate the means and SDs all at once (instead of separately like in my 2nd block of code), but that resulted in a single "observation" where half the variables were means and half were SDs, and I couldn't see an easy way to export them (I'll be making more tables, so doing 15 or so concatenate functions would be slower than copying by hand). Is there a way to have collapse create two "observations," where one row is means and the second is SDs? Because if so, reshaping it and then using concatenate would work really well.
    Attached Files

  • #2
    How about processing them into a string in Stata? Like this:

    Code:
    sysuse auto, clear
    
    collapse (mean) mpg (sd) mpg_sd = mpg, by(rep78)
    gen x1 = string(mpg, "%8.1f") + " ± " + string(mpg_sd, "%8.1f")
    export excel using "table01.xlsx", sheet(example) sheetreplace

    Comment


    • #3
      Hi Ken--thanks so much! It absolutely worked. The only downside is that it involved typing out a lot of variable names (proofing it took quite a while) and will be difficult to replicate for other tables. I ended up splitting it into two sections to make it easier to read/edit. I was hoping to avoid typing all the var names out like that, but I understand if there is no shorter way. This is my first major analysis (my thesis!) so I'm still learning tricks and efficiency.

      If I make a table in the future where I don't need the mean and SD in the same cell, it would be nice to pull out a summary table directly. Is it possible to pull out info saved in r() in formatted tables like that? Doing something like:
      Code:
      summarize var1 var2 var3
      export excel r(mean) r(sd)
      When I've tried that before, only the values for var3 were stored in r().


      For other who are curious, here's my working code:
      Code:
      *** child mean and sd for pql/qol, for wk0/wk21/6m, concatenated with plus/minus and exported to excel, ready to copy paste into word
      preserve
      collapse (mean) ctot0m = pql_c_total_mean_wk0 cpf0m = pql_c_pf_mean_wk0 cef0m = pql_c_ef_mean_wk0 csf0m = pql_c_sf_mean_wk0 csch0m = pql_c_sch_mean_wk0 ///
                      cqtot0m = qol_c_total_mean_wk0 cself0m = qol_c_self_mean_wk0 csoc0m = qol_c_soc_mean_wk0 cenv0m = qol_c_env_mean_wk0 ///
                      ctot21m = pql_c_total_mean_wk21 cpf21m = pql_c_pf_mean_wk21 cef21m = pql_c_ef_mean_wk21 csf21m = pql_c_sf_mean_wk21 csch21m = pql_c_sch_mean_wk21 ///
                      cqtot21m = qol_c_total_mean_wk21 cself21m = qol_c_self_mean_wk21 csoc21m = qol_c_soc_mean_wk21 cenv21m = qol_c_env_mean_wk21 ///
                      ctot6m = pql_c_total_mean_6m cpf6m = pql_c_pf_mean_6m cef6m = pql_c_ef_mean_6m csf6m = pql_c_sf_mean_6m csch6m = pql_c_sch_mean_6m ///
                      cqtot6m = qol_c_total_mean_6m cself6m = qol_c_self_mean_6m csoc6m = qol_c_soc_mean_6m cenv6m = qol_c_env_mean_6m ///
                      ctotdiffm = pql_c_total_0to21 cpfdiffm = pql_c_pf_0to21 cefdiffm = pql_c_ef_0to21 csfdiffm = pql_c_sf_0to21 cschdiffm = pql_c_sch_0to21 ///
                      cqtotdiffm = qol_c_total_0to21 cselfdiffm = qol_c_self_0to21 csocdiffm = qol_c_soc_0to21 cenvdiffm = qol_c_env_0to21 ///
                 (sd) ctot0sd = pql_c_total_mean_wk0 cpf0sd = pql_c_pf_mean_wk0 cef0sd = pql_c_ef_mean_wk0 csf0sd = pql_c_sf_mean_wk0 csch0sd = pql_c_sch_mean_wk0 ///
                      cqtot0sd = qol_c_total_mean_wk0 cself0sd = qol_c_self_mean_wk0 csoc0sd = qol_c_soc_mean_wk0 cenv0sd = qol_c_env_mean_wk0 ///
                      ctot21sd = pql_c_total_mean_wk21 cpf21sd = pql_c_pf_mean_wk21 cef21sd = pql_c_ef_mean_wk21 csf21sd = pql_c_sf_mean_wk21 csch21sd = pql_c_sch_mean_wk21 ///
                      cqtot21sd = qol_c_total_mean_wk21 cself21sd = qol_c_self_mean_wk21 csoc21sd = qol_c_soc_mean_wk21 cenv21sd = qol_c_env_mean_wk21 ///
                      ctot6sd = pql_c_total_mean_6m cpf6sd = pql_c_pf_mean_6m cef6sd = pql_c_ef_mean_6m csf6sd = pql_c_sf_mean_6m csch6sd = pql_c_sch_mean_6m ///
                      cqtot6sd = qol_c_total_mean_6m cself6sd = qol_c_self_mean_6m csoc6sd = qol_c_soc_mean_6m cenv6sd = qol_c_env_mean_6m ///
                      ctotdiffsd = pql_c_total_0to21 cpfdiffsd = pql_c_pf_0to21 cefdiffsd = pql_c_ef_0to21 csfdiffsd = pql_c_sf_0to21 cschdiffsd = pql_c_sch_0to21 ///
                      cqtotdiffsd = qol_c_total_0to21 cselfdiffsd = qol_c_self_0to21 csocdiffsd = qol_c_soc_0to21 cenvdiffsd = qol_c_env_0to21
      
      foreach var in ctot0 cpf0 cef0 csf0 csch0 cqtot0 cself0 csoc0 cenv0 ///
                     ctot21 cpf21 cef21 csf21 csch21 cqtot21 cself21 csoc21 cenv21 ///
                     ctot6 cpf6 cef6 csf6 csch6 cqtot6 cself6 csoc6 cenv6 ///
                     ctotdiff cpfdiff cefdiff csfdiff cschdiff cqtotdiff cselfdiff csocdiff cenvdiff {
          gen `var'_str = string(`var'm, "%8.1f") + " ± " + string(`var'sd, "%8.1f")
      }
      keep *_str
      export excel using "\\childrens\research\nik\Mark\Writing\Output\table3.xlsx", sheet(child) sheetreplace firstrow(var)
      restore
      
      *** parent mean and sd for pql/qol, for wk0/wk21/6m, concatenated with plus/minus and exported to excel, ready to copy paste into word
      preserve
      collapse (mean) ptot0m = pql_p_total_mean_wk0 ppf0m = pql_p_pf_mean_wk0 pef0m = pql_p_ef_mean_wk0 psf0m = pql_p_sf_mean_wk0 psch0m = pql_p_sch_mean_wk0 ///
                      pqtot0m = qol_p_total_mean_wk0 pself0m = qol_p_self_mean_wk0 psoc0m = qol_p_soc_mean_wk0 penv0m = qol_p_env_mean_wk0 ///
                      ptot21m = pql_p_total_mean_wk21 ppf21m = pql_p_pf_mean_wk21 pef21m = pql_p_ef_mean_wk21 psf21m = pql_p_sf_mean_wk21 psch21m = pql_p_sch_mean_wk21 ///
                      pqtot21m = qol_p_total_mean_wk21 pself21m = qol_p_self_mean_wk21 psoc21m = qol_p_soc_mean_wk21 penv21m = qol_p_env_mean_wk21 ///
                      ptot6m = pql_p_total_mean_6m ppf6m = pql_p_pf_mean_6m pef6m = pql_p_ef_mean_6m psf6m = pql_p_sf_mean_6m psch6m = pql_p_sch_mean_6m ///
                      pqtot6m = qol_p_total_mean_6m pself6m = qol_p_self_mean_6m psoc6m = qol_p_soc_mean_6m penv6m = qol_p_env_mean_6m ///
                      ptotdiffm = pql_p_total_0to21 ppfdiffm = pql_p_pf_0to21 pefdiffm = pql_p_ef_0to21 psfdiffm = pql_p_sf_0to21 pschdiffm = pql_p_sch_0to21 ///
                      pqtotdiffm = qol_p_total_0to21 pselfdiffm = qol_p_self_0to21 psocdiffm = qol_p_soc_0to21 penvdiffm = qol_p_env_0to21 ///
                (sd)  ptot0sd = pql_p_total_mean_wk0 ppf0sd = pql_p_pf_mean_wk0 pef0sd = pql_p_ef_mean_wk0 psf0sd = pql_p_sf_mean_wk0 psch0sd = pql_p_sch_mean_wk0 ///
                      pqtot0sd = qol_p_total_mean_wk0 pself0sd = qol_p_self_mean_wk0 psoc0sd = qol_p_soc_mean_wk0 penv0sd = qol_p_env_mean_wk0 ///
                      ptot21sd = pql_p_total_mean_wk21 ppf21sd = pql_p_pf_mean_wk21 pef21sd = pql_p_ef_mean_wk21 psf21sd = pql_p_sf_mean_wk21 psch21sd = pql_p_sch_mean_wk21 ///
                      pqtot21sd = qol_p_total_mean_wk21 pself21sd = qol_p_self_mean_wk21 psoc21sd = qol_p_soc_mean_wk21 penv21sd = qol_p_env_mean_wk21 ///
                      ptot6sd = pql_p_total_mean_6m ppf6sd = pql_p_pf_mean_6m pef6sd = pql_p_ef_mean_6m psf6sd = pql_p_sf_mean_6m psch6sd = pql_p_sch_mean_6m ///
                      pqtot6sd = qol_p_total_mean_6m pself6sd = qol_p_self_mean_6m psoc6sd = qol_p_soc_mean_6m penv6sd = qol_p_env_mean_6m ///
                      ptotdiffsd = pql_p_total_0to21 ppfdiffsd = pql_p_pf_0to21 pefdiffsd = pql_p_ef_0to21 psfdiffsd = pql_p_sf_0to21 pschdiffsd = pql_p_sch_0to21 ///
                      pqtotdiffsd = qol_p_total_0to21 pselfdiffsd = qol_p_self_0to21 psocdiffsd = qol_p_soc_0to21 penvdiffsd = qol_p_env_0to21
      
      foreach var in ptot0 ppf0 pef0 psf0 psch0 pqtot0 pself0 psoc0 penv0 ///
                     ptot21 ppf21 pef21 psf21 psch21 pqtot21 pself21 psoc21 penv21 ///
                     ptot6 ppf6 pef6 psf6 psch6 pqtot6 pself6 psoc6 penv6 ///
                     ptotdiff ppfdiff pefdiff psfdiff pschdiff pqtotdiff pselfdiff psocdiff penvdiff {
          gen `var'_str = string(`var'm, "%8.1f") + " ± " + string(`var'sd, "%8.1f")
      }
      keep *str
      export excel using "\\childrens\research\nik\Mark\Writing\Output\table3.xlsx", sheet(parent) sheetreplace firstrow(var)
      restore

      Comment

      Working...
      X