You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
294 lines
8.4 KiB
Plaintext
294 lines
8.4 KiB
Plaintext
8 months ago
|
*! Version 1.2 29 August 2019
|
||
|
*! Jean-Benoit Hardouin
|
||
|
************************************************************************************************************
|
||
|
* Stata program : descscale
|
||
|
* Description of a scale and covariates
|
||
|
* Release 1.1 : June 4, 2019
|
||
|
*
|
||
|
*
|
||
|
* Historic :
|
||
|
* Version 1 (April 12, 2019) [Jean-Benoit Hardouin]
|
||
|
* Version 1.1 (June 4, 2019) [Jean-Benoit Hardouin]
|
||
|
* Version 1.2 (August 29, 2019) [Jean-Benoit Hardouin] /*correction of bugs*/
|
||
|
*
|
||
|
* Jean-benoit Hardouin, PhD, Assistant Professor
|
||
|
* Team of Methods in Patient Centered Outcomes and Health Research (INSERM U1246-SPHERE)
|
||
|
* University of Nantes - Faculty of Pharmaceutical Sciences
|
||
|
* France
|
||
|
* jean-benoit.hardouin@anaqol.org
|
||
|
*
|
||
|
*
|
||
|
* News about this program :http://www.anaqol.org
|
||
|
*
|
||
|
* Copyright 2019 Jean-Benoit Hardouin
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*
|
||
|
***********************************************************************************************************
|
||
|
program define descscale , rclass
|
||
|
version 8.2
|
||
|
syntax varlist [if] [in] [,MIN(int 0) CONTinuous(varlist) CATegorical(varlist) All PARTition(numlist) Large MEAN MAXlevels(int 20)]
|
||
|
|
||
|
preserve
|
||
|
marksample touse,novarlist
|
||
|
label variable `touse' "selection"
|
||
|
|
||
|
tokenize `varlist'
|
||
|
local nbitems: word count `varlist'
|
||
|
if "`partition'"=="" {
|
||
|
local partition `nbitems'
|
||
|
}
|
||
|
local nbdim:word count `partition'
|
||
|
forvalues i=1/`nbdim' {
|
||
|
local nbitemsdim`i': word `i' of `partition'
|
||
|
}
|
||
|
qui count if `touse'
|
||
|
local N=r(N)
|
||
|
local maxr=0
|
||
|
forvalues i=1/`nbitems' {
|
||
|
qui levelsof ``i'' if `touse'
|
||
|
local r`i'=r(r)
|
||
|
qui su ``i'' if `touse'
|
||
|
local max`i'=r(max)
|
||
|
local mean`i'=r(mean)
|
||
|
qui count if ``i''!=0&``i''!=1&``i''!=2&``i''!=3&``i''!=4&``i''!=5&``i''!=6&``i''!=7&``i''!=8&``i''!=9&``i''!=10&``i''!=.
|
||
|
local ninc=r(N)
|
||
|
local ok`i'=1
|
||
|
if `r`i''>11&"`large'"=="" {
|
||
|
di in red "The number of answer categories to the items ``i'' is large (>11). Use the -large- option or correct the list of items."
|
||
|
local ok`i'=0
|
||
|
exit
|
||
|
}
|
||
|
if `ninc'>0 {
|
||
|
di in red "The variable ``i'' has incompatible values with an items (integers between 0 and 10)."
|
||
|
local ok`i'=0
|
||
|
exit
|
||
|
}
|
||
|
if `max`i''>`maxr' {
|
||
|
local maxr `max`i''
|
||
|
}
|
||
|
}
|
||
|
di "maxr=`maxr'"
|
||
|
di
|
||
|
di in green "Number of individuals : " as result `N'
|
||
|
|
||
|
di
|
||
|
di in green "Description of the items"
|
||
|
local long=(`maxr'+1-`min')*8+40
|
||
|
di in green "{hline `long'}"
|
||
|
|
||
|
di in green "Items" _col(23) "Obs" _c
|
||
|
local col=33
|
||
|
forvalues j=`min'/`maxr' {
|
||
|
di _col(`col') "`j'" _c
|
||
|
local col=`col'+8
|
||
|
}
|
||
|
di _col(`col') "." _col(`=`col'+4') "Mean"
|
||
|
di in green "{hline `long'}"
|
||
|
|
||
|
local deb=1
|
||
|
forvalues d=1/`nbdim' {
|
||
|
local loi`d'
|
||
|
*di "local fin=`deb'+`nbitemsdim`d''-1"
|
||
|
local fin=`deb'+`nbitemsdim`d''-1
|
||
|
forvalues i=`deb'/`fin' {
|
||
|
if `ok`i''==1 {
|
||
|
local loi`d' `loi`d'' ``i''
|
||
|
qui count if `touse'&``i''!=.
|
||
|
local k=abbrev("``i''",20)
|
||
|
di in green "`k'" _col(22) as result %4.0f `r(N)' _c
|
||
|
local col=28
|
||
|
forvalues j=`min'/`maxr' {
|
||
|
qui count if `touse'&``i''==`j'
|
||
|
local per=round(`r(N)'/`N'*100, 0.1)
|
||
|
di _col(`col') %5.1f `per' "%" _c
|
||
|
local col=`col'+8
|
||
|
}
|
||
|
qui count if `touse'&``i''==.
|
||
|
local per=round(`r(N)'/`N'*100,0.1)
|
||
|
di _col(`col') %5.1f `per' "%" _col(`=`col'+9') %4.2f `mean`i''
|
||
|
}
|
||
|
}
|
||
|
if `d'!=`nbdim' {
|
||
|
di in green "{dup `long':-}"
|
||
|
}
|
||
|
local deb=`fin'+1
|
||
|
}
|
||
|
di in green "{hline `long'}"
|
||
|
|
||
|
di
|
||
|
di in green "Description of the scores"
|
||
|
local long2=72
|
||
|
di in green "{hline `long2'}"
|
||
|
di in green "Scores" _col(22) "Obs" _col(33) "Mean" _col(40) "Std. Dev." _col(58) "Min" _col(70) "Max"
|
||
|
di in green "{hline `long2'}"
|
||
|
|
||
|
forvalues d=1/`nbdim' {
|
||
|
tempname score`d'
|
||
|
genscore `loi`d'' if `touse', score(`score`d'') `mean' `standardized'
|
||
|
qui su `score`d'' if `touse'
|
||
|
di in green "score`d'" _col(20) as result %5.0f `r(N)' _col(30) %7.2f `r(mean)' _col(42) %7.2f `r(sd)' _col(54) %7.2f `r(min)' _col(66) %7.2f `r(max)'
|
||
|
}
|
||
|
di in green "{hline `long2'}"
|
||
|
|
||
|
|
||
|
if "`continuous'"!="" {
|
||
|
local continuous2
|
||
|
foreach i of varlist `continuous' {
|
||
|
local candidate=1
|
||
|
forvalues j=1/`nbitems' {
|
||
|
if "`i'"=="``j''" {
|
||
|
local candidate=0
|
||
|
}
|
||
|
}
|
||
|
local type : type `i'
|
||
|
local type=substr("`type'",1,3)
|
||
|
if "`type'"=="str" {
|
||
|
local candidate=0
|
||
|
}
|
||
|
if `candidate'==1 {
|
||
|
qui levelsof `i' if `touse'
|
||
|
local r=r(r)
|
||
|
local continuous2 `continuous2' `i'
|
||
|
}
|
||
|
}
|
||
|
local continuous `continuous2'
|
||
|
}
|
||
|
if "`categorical'"!="" {
|
||
|
local categorical2
|
||
|
foreach i of varlist `categorical' {
|
||
|
local candidate=1
|
||
|
forvalues j=1/`nbitems' {
|
||
|
if "`i'"=="``j''" {
|
||
|
local candidate=0
|
||
|
}
|
||
|
}
|
||
|
if `candidate'==1 {
|
||
|
qui levelsof `i' if `touse'
|
||
|
local r=r(r)
|
||
|
local categorical2 `categorical2' `i'
|
||
|
}
|
||
|
}
|
||
|
local categorical `categorical2'
|
||
|
}
|
||
|
|
||
|
if "`all'"!="" {
|
||
|
*local continuous
|
||
|
*local categorial
|
||
|
foreach i of varlist * {
|
||
|
local candidate=1
|
||
|
forvalues j=1/`nbitems' {
|
||
|
if "`i'"=="``j''" {
|
||
|
local candidate=0
|
||
|
}
|
||
|
}
|
||
|
local type : type `i'
|
||
|
local type=substr("`type'",1,3)
|
||
|
if "`type'"=="str" {
|
||
|
local candidate=0
|
||
|
}
|
||
|
qui levelsof `i' if `touse'
|
||
|
local r=r(r)
|
||
|
if `r'>7&`candidate'==1 {
|
||
|
local continuous `continuous' `i'
|
||
|
}
|
||
|
else {
|
||
|
local categorical `categorical' `i'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*di "CONTINUOUS : `continuous'"
|
||
|
*di "CATEGORICAL : `categorical'"
|
||
|
|
||
|
if "`continuous'"!="" {
|
||
|
di
|
||
|
di "Descriptive analysis of continuous covariates"
|
||
|
local long2=72
|
||
|
di in green "{hline `long2'}"
|
||
|
di in green "Variables" _col(22) "Obs" _col(33) "Mean" _col(40) "Std. Dev." _col(58) "Min" _col(70) "Max"
|
||
|
di in green "{hline `long2'}"
|
||
|
foreach i of varlist `continuous' {
|
||
|
qui su `i' if `touse'
|
||
|
local k=abbrev("`i'",18)
|
||
|
*di in green "`k'" _c
|
||
|
di in green "`k'" _col(20) as result %5.0f `r(N)' _col(30) %7.2f `r(mean)' _col(42) %7.2f `r(sd)' _col(54) %7.2f `r(min)' _col(66) %7.2f `r(max)'
|
||
|
}
|
||
|
di in green "{hline `long2'}"
|
||
|
}
|
||
|
if "`categorical'"!="" {
|
||
|
di
|
||
|
*set trace on
|
||
|
di "Descriptive analysis of categorical covariates"
|
||
|
local long2=55
|
||
|
di in green "{hline `long2'}"
|
||
|
di in green "Variables" _col(25) "Levels" _col(37) "Freq." _col(49) "Percent"
|
||
|
di in green "{hline `long2'}"
|
||
|
local nbc: word count `categorical'
|
||
|
local m=1
|
||
|
local nonret
|
||
|
foreach i of varlist `categorical' {
|
||
|
local type : type `i'
|
||
|
local type=substr("`type'",1,3)
|
||
|
qui levelsof `i'
|
||
|
local lev "`r(levels)'"
|
||
|
local nblev=r(r)
|
||
|
if (`maxlevels'>=`nblev') {
|
||
|
local k=abbrev("`i'",20)
|
||
|
di in green "`k'" _c
|
||
|
if "`type'"=="str" {
|
||
|
foreach j in `lev' {
|
||
|
qui count if `touse'&`i'=="`j'"
|
||
|
local k=abbrev("`j'",10)
|
||
|
di _col(21) %10s in green "`k'" as result %5.0f _col(37) `r(N)' %6.2f _col(49) `=`r(N)'/`N'*100' "%"
|
||
|
}
|
||
|
qui count if `touse'&`i'==""
|
||
|
if `r(N)'!=0 {
|
||
|
di as result %5.0f _col(37) `r(N)' %6.2f _col(49) `=`r(N)'/`N'*100' "%"
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
foreach j in `lev' {
|
||
|
qui count if `touse'&`i'==`j'
|
||
|
di _col(21) %10s in green "`j'" as result %5.0f _col(37) `r(N)' %6.2f _col(49) `=`r(N)'/`N'*100' "%"
|
||
|
}
|
||
|
qui count if `touse'&`i'==.
|
||
|
if `r(N)'!=0 {
|
||
|
di as result %5.0f _col(37) `r(N)' %6.2f _col(49) `=`r(N)'/`N'*100' "%"
|
||
|
}
|
||
|
}
|
||
|
if `m'==`nbc' {
|
||
|
di in green "{hline `long2'}"
|
||
|
}
|
||
|
else {
|
||
|
di in green "{dup `long2':-}"
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local nonret `nonret' `i'
|
||
|
*di "local nonret `nonret' `i'"
|
||
|
*di "non retenu `i'"
|
||
|
if `m'==`nbc' {
|
||
|
di in green "{hline `long2'}"
|
||
|
}
|
||
|
}
|
||
|
local ++m
|
||
|
}
|
||
|
if "`nonret'"!="" {
|
||
|
di in green "Not described variables (too more levels) : " as result "`nonret'"
|
||
|
}
|
||
|
}
|
||
|
end
|