Simple means and proportions Table 2.3
Effect of design aspects on precision of estimates table 2.4
Chi square tests tables 2.6 onwards
Internet use by council area
Survey logistic regressions
Code to plot Figure 1
############################################### # HOW TO USE THIS FILE # This is an HTML file to show you what R output looks like # Comments relate to interpretation of output # for comments on how torun code see the html R source code
red stuff is (R commands)
blue is output
# Black is comment
> names(shs)
[1] "PSU" "UNIQID" "IND_WT" "SHS_6CLA" "COUNCIL" [6] "RC5" "RC7E" "RC7G" "INTUSE" "GROUPINC" [11] "CLUST" "STRATUM" "AGE" "SEX" "EMP_STA" [16] "GROSSWT" "GROC"
# the range of weights is pretty large and the ratio of the most # extreme weights is big
# the range of weights is # large and the ratio of # extremes of weights is big > hist(shs$IND_WT,col='red') > range(shs$IND_WT) [1] 0.05373944 6.29964895 |
![]() |
> max(shs$IND_WT)/min(shs$IND_WT)
[1] 117.2258
> library(survey) > shs.des <- svydesign(id=~PSU, weights=~GROSSWT,strata=~STRATUM,data=shs) > print(summary(shs.des))
Stratified 1 - level Cluster Sampling design
With (11937) clusters.
svydesign(id = ~PSU, weights = ~GROSSWT, strata = ~STRATUM, data = shs)
Probabilities:
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.001113 0.005406 0.007731 0.010660 0.011650 0.130500
Stratum Sizes:
1 2 3 4 5 6 7 8 9 10 11 12 13
obs 202 130 192 22 95 78 137 246 54 8 142 194 144
design.PSU 202 130 192 22 95 78 137 246 54 8 13 18 13
actual.PSU 202 130 192 22 95 78 137 246 54 8 13 18 13
lines ommitted here
269 270 271 272 273 274 275 276 277 278 279 280
obs 46 65 63 37 11 32 11 64 168 223 157 88
design.PSU 46 65 63 37 11 32 11 7 20 21 13 9
actual.PSU 46 65 63 37 11 32 11 7 20 21 13 9
281
obs 34
design.PSU 4
actual.PSU 4
Data variables:
[1] "PSU" "UNIQID" "IND_WT" "SHS_6CLA" "COUNCIL"
[6] "RC5" "RC7E" "RC7G" "INTUSE" "GROUPINC"
[11] "CLUST" "STRATUM" "AGE" "SEX" "EMP_STA"
[16] "GROSSWT" "GROC"
> # NOTE THAT SOME STRATA HAVE BEEN COMBINED TO PREVENT LONELY PSUS # back to top![]()
> svymean(~INTUSE,shs.des,deff=T)
mean SE DEff
INTUSE 0.3415642 0.0034046 1.4889
> svyby(~INTUSE,~SEX,shs.des,svymean,keep.var=T,deff=T)
SEX statistic.INTUSE SE DEff
male male 0.3851593 0.005124113 1.358964
female female 0.3070535 0.004329645 1.465283
There were 18 warnings (use warnings() to see them)
# The error messages are because splitting the data by sex has # produced a few more lonely PSUS. See the html help for # survey.lonely.psu by following links from html help menu to # >packages >survey # A better option is to adjust estimates for this
> options("survey.adjust.domain.lonely"=T)
> options("survey.lonely.psu"='adjust')
> svyby(~INTUSE,~SEX,shs.des,svymean,keep.var=T,deff=T)
SEX statistic.INTUSE SE DEff
male male 0.3851593 0.005124113 1.358964
female female 0.3070535 0.004329645 1.465283
There were 18 warnings (use warnings() to see them)
# this increases the design effect by only a tiny amount # so not worth fussing with here
> svymean(~RC5,subset(shs.des,INTUSE==1),deff=T)
mean SE DEff
RC5Up to 1 hour a week 0.4082868 0.0060968 1.3722
RC5Over 1 hour, up to 5 hours 0.4066075 0.0060470 1.3517
RC5Over 5 hours up to 10 hours 0.1082947 0.0037595 1.3054
RC5Over 10 hours up to 20 hours 0.0507795 0.0027595 1.4090
RC5Over 20 hours 0.0260314 0.0019740 1.3707
There were 18 warnings (use warnings() to see them)
# back to top# testing efect of different designs
> shs.des <- svydesign(id=~UNIQID, weights=~GROSSWT,data=shs) > svymean(~INTUSE,shs.des,deff=T)
mean SE DEff
INTUSE 0.3415642 0.0032671 1.371
> shs.des <- svydesign(id=~PSU, weights=~GROSSWT,data=shs) > svymean(~INTUSE,shs.des,deff=T)
mean SE DEff
INTUSE 0.3415642 0.0037742 1.8297
> shs.des <- svydesign(id=~UNIQID, weights=~GROSSWT,strata=~STRATUM,data=shs) > svymean(~INTUSE,shs.des,deff=T)
mean SE DEff
INTUSE 0.3415642 0.0031608 1.2833
> shs.des <- svydesign(id=~PSU, weights=~GROSSWT,strata=~STRATUM,data=shs) > svymean(~INTUSE,shs.des,deff=T)
mean SE DEff
INTUSE 0.3415642 0.0034046 1.4889
# back to top > svychisq(~INTUSE+SEX,shs.des)
Pearson's X^2: Rao & Scott adjustment
data: svychisq(~INTUSE + SEX, shs.des)
F = 143.8122, ndf = 1, ddf = 11936, p-value <
2.2e-16
> chisq.test(table(shs$INTUSE,shs$SEX),correct=F)
> svytable(~INTUSE+SEX,shs.des)
SEX
INTUSE male female
0 1109378.6 1579433.7
1 694956.4 699867.4
# table gives sum of weights by default
> svytable(~SEX+GROC,shs.des)
GROC
SEX 0 1
male 1755180.10 49154.96
female 2211799.09 67502.00
> svychisq(~GROC+SEX,shs.des)
Pearson's X^2: Rao & Scott adjustment
data: svychisq(~GROC + SEX, shs.des)
F = 1.0726, ndf = 1, ddf = 11936, p-value = 0.3004
> chisq.test(table(shs$GROC,shs$SEX),correct=F)
Pearson's Chi-squared test
data: table(shs$GROC, shs$SEX)
X-squared = 0.1983, df = 1, p-value = 0.6561
> svychisq(~RC5+EMP_STA,subset(shs.des,INTUSE==1))
Pearson's X^2: Rao & Scott adjustment
data: svychisq(~RC5 + EMP_STA, subset(shs.des, INTUSE == 1))
F = 7.191, ndf = 42.015, ddf = 205243.504, p-value <
2.2e-16
Warning messages:
1: Stratum (47) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
2: Stratum (58) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
3: Stratum (77) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
4: Stratum (92) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
5: Stratum (97) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
6: Stratum (260) has only one PSU at stage 1 in: onestrat(x[index, , drop = FALSE], clusters[index], nPSU[index][1],
# more lonely PSUs
> chisq.test(table(shs$RC5,shs$EMP_STA),correct=T)
Pearson's Chi-squared test data: table(shs$RC5, shs$EMP_STA) X-squared = 348.1233, df = 44, p-value < 2.2e-16 Warning message: Chi-squared approximation may be incorrect in: chisq.test(table(shs$RC5, shs$EMP_STA), correct = T)
# as is often the case, this message is not necessary, # rule of thumb used by program is too strict# back to top
> svyby(~INTUSE,~COUNCIL,shs.des,svymean,keep.var=T,deff=T)
COUNCIL statistic.INTUSE SE DEff
Aberdeen City Aberdeen City 0.4259058 0.01549399 1.150013
Aberdeenshire Aberdeenshire 0.3730824 0.01776256 1.530558
Angus Angus 0.3570794 0.02228616 1.383812
Argyll & Bute Argyll & Bute 0.3244755 0.02701520 1.838561
Clackmannanshire Clackmannanshire 0.3005110 0.03016245 2.281721
Dumfries & Galloway Dumfries & Galloway 0.2524177 0.01676567 1.162006
Dundee City Dundee City 0.3167761 0.01821253 1.215296
East Ayrshire East Ayrshire 0.2995928 0.02261369 1.607520
East Dunbartonshire East Dunbartonshire 0.4710906 0.02366215 1.258309
East Lothian East Lothian 0.3789814 0.02632696 1.641675
East Renfrewshire East Renfrewshire 0.4395395 0.02396917 1.187309
Edinburgh, City of Edinburgh, City of 0.4516778 0.01133339 1.165448
Eilean Siar Eilean Siar 0.2594083 0.02015594 1.371884
Falkirk Falkirk 0.3389266 0.01965099 1.294220
Fife Fife 0.3304139 0.01376578 1.524050
Glasgow City Glasgow City 0.2788830 0.00895252 1.217506
Highland Highland 0.3830987 0.01690704 1.316076
Inverclyde Inverclyde 0.2964038 0.02291117 1.264850
Midlothian Midlothian 0.3433780 0.02326079 1.464382
Moray Moray 0.3067903 0.02525173 1.757371
North Ayrshire North Ayrshire 0.2462255 0.02206251 1.921944
North Lanarkshire North Lanarkshire 0.2802862 0.01491976 1.717864
Orkney Islands Orkney Islands 0.3083178 0.03012039 2.724578
Perth & Kinross Perth & Kinross 0.3762066 0.02259931 1.478352
Renfrewshire Renfrewshire 0.3161091 0.01742582 1.270713
Scottish Borders Scottish Borders 0.3575336 0.02692191 1.935275
Shetland Islands Shetland Islands 0.4711420 0.02854234 2.054934
South Ayrshire South Ayrshire 0.3294139 0.02528204 1.952842
South Lanarkshire South Lanarkshire 0.3189291 0.01561810 1.726094
Stirling Stirling 0.4327323 0.02651420 1.647057
West Dunbartonshire West Dunbartonshire 0.2791583 0.02367021 1.398244
West Lothian West Lothian 0.3524483 0.02099518 1.426553
# back to top > summary(svyglm(INTUSE~GROUPINC,subset(shs.des,!is.na(GROUPINC)),family='binomial'))
Call:
svyglm.survey.design(formula = INTUSE ~ GROUPINC, design = subset(shs.des,
!is.na(GROUPINC)), family = "binomial")
Survey design:
subset.survey.design(shs.des, !is.na(GROUPINC))
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.11339 0.10629 -10.475 < 2e-16 ***
GROUPINCunder 10K -0.76785 0.11376 -6.750 1.51e-11 ***
GROUPINC10-20K 0.04745 0.10883 0.436 0.663
GROUPINC20-30k 0.97683 0.11043 8.845 < 2e-16 ***
GROUPINC30-50k 1.89464 0.11504 16.470 < 2e-16 ***
GROUPINC50K+ 2.44274 0.16282 15.003 < 2e-16 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
(Dispersion parameter for binomial family taken to be 1)
Number of Fisher Scoring iterations: 5
> # add rurality
> summary(svyglm(INTUSE~GROUPINC+SHS_6CLA,subset(shs.des,!is.na(GROUPINC)),family='binomial'))
Call:
svyglm.survey.design(formula = INTUSE ~ GROUPINC + SHS_6CLA,
design = subset(shs.des, !is.na(GROUPINC)), family = "binomial")
Survey design:
subset.survey.design(shs.des, !is.na(GROUPINC))
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.04553 0.10782 -9.697 < 2e-16 ***
GROUPINCunder 10K -0.76579 0.11476 -6.673 2.55e-11 ***
GROUPINC10-20K 0.05813 0.10987 0.529 0.59671
GROUPINC20-30k 0.99344 0.11160 8.901 < 2e-16 ***
GROUPINC30-50k 1.91223 0.11620 16.457 < 2e-16 ***
GROUPINC50K+ 2.44744 0.16402 14.922 < 2e-16 ***
SHS_6CLAoth urban -0.18763 0.04109 -4.566 4.99e-06 ***
SHS_6CLAaccessible towns -0.06250 0.05738 -1.089 0.27606
SHS_6CLAremote towns -0.09267 0.10321 -0.898 0.36928
SHS_6CLAaccessible rural -0.14266 0.05253 -2.716 0.00661 **
SHS_6CLAremote rural 0.02935 0.06747 0.435 0.66354
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
(Dispersion parameter for binomial family taken to be 0.9972467)
Number of Fisher Scoring iterations: 5
# back to top
#> fit<-svyglm(INTUSE~GROUPINC,design=shs.des)
# now some more complicated code to fit the curves for age and sex # # shown on the first page of this exemplar # using the splines library in R
> library(splines)
# replace one missing value in age
> shs$AGE[is.na(shs$AGE)]<-40 > splinexs<-bs(shs$AGE,knots=c(25,45,65),degree=3) > SP1<-splinexs[,1] > SP2<-splinexs[,2] > SP3<-splinexs[,3] > SP4<-splinexs[,4] > SP5<-splinexs[,5] > SP6<-splinexs[,6]
# add extra vars to survey design
> shs.des<-update(shs.des,SP1=SP1,SP2=SP2,SP3=SP3,SP4=SP4,SP5=SP5,SP6=SP6,AGE=AGE)
> fit<-svyglm(INTUSE~SP1+SP2+SP3+SP5+SP6
+ +(as.integer(SEX)-1)+ (as.integer(SEX)-1)*SP1+
+ (as.integer(SEX)-1)*SP2+(as.integer(SEX)-1)*SP3+
+ (as.integer(SEX)-1)*SP4+(as.integer(SEX)-1)*SP5+
+ (as.integer(SEX)-1)*SP6
+ , design=shs.des, family='binomial')
> plot(c(15,83),c(0,65),type='n',xlab='age',ylab='% internet users',)
> ilogit<-function(x){1/(1+exp(-x))}
> Mfit<- ilogit(predict(fit))[shs$SEX=='male'][match(c(16:80),shs$AGE[shs$SEX=='male'])]*100
> Wfit<- ilogit(predict(fit))[shs$SEX=='female'][match(c(16:80),shs$AGE[shs$SEX=='female'])]*100
> agemeans<-svyby(~INTUSE,~SEX+AGE,shs.des,svymean)
> usebyageM<-agemeans[1:65,3]*100
> usebyageW<-agemeans[1:65+65,3]*100
> plot(c(15,83),c(0,65),type='n',xlab='age',ylab='% internet users',)
> points(c(16:79,82),usebyageM)
> points(c(16:79,82),usebyageW,col=2,pch=16)
> lines(c(16:79,82),Mfit,lwd=2)
> lines(c(16:79,82),Wfit,lwd=2,col=2)
########################################################## > # now look at additional effect of other variables > #
> summary(update(fit,~.+SHS_6CLA))
Call:
svyglm.survey.design(formula = INTUSE ~ SP1 + SP2 + SP3 + SP5 +
SP6 + as.integer(SEX) + SP4 + SHS_6CLA + SP1:as.integer(SEX) +
SP2:as.integer(SEX) + SP3:as.integer(SEX) + as.integer(SEX):SP4 +
SP5:as.integer(SEX) + SP6:as.integer(SEX) - 1, design = shs.des,
family = "binomial")
Survey design:
update.survey.design(shs.des, SP1 = SP1, SP2 = SP2, SP3 = SP3,
SP4 = SP4, SP5 = SP5, SP6 = SP6, AGE = AGE)
Coefficients:
Estimate Std. Error t value
SP1 0.9419 0.5929 1.589
SP2 0.9405 0.4319 2.178
SP3 0.7825 0.5191 1.507
SP5 -0.3547 0.6350 -0.559
SP6 -1.7107 0.6819 -2.509
as.integer(SEX) 0.4134 0.2383 1.735
SP4 -0.5724 0.4965 -1.153
SHS_6CLAlarge urban -0.3281 0.3794 -0.865
SHS_6CLAoth urban -0.4373 0.3798 -1.152
SHS_6CLAaccessible towns -0.2152 0.3824 -0.563
SHS_6CLAremote towns -0.2587 0.3975 -0.651
SHS_6CLAaccessible rural -0.1756 0.3826 -0.459
SHS_6CLAremote rural -0.1175 0.3845 -0.306
SP1:as.integer(SEX) -0.6059 0.3666 -1.653
SP2:as.integer(SEX) -0.8730 0.2685 -3.251
SP3:as.integer(SEX) -0.6574 0.3251 -2.022
as.integer(SEX):SP4 -0.8790 0.3167 -2.776
SP5:as.integer(SEX) -1.9190 0.4153 -4.621
SP6:as.integer(SEX) -1.9499 0.4731 -4.122
Pr(>|t|)
SP1 0.11212
SP2 0.02945 *
SP3 0.13171
SP5 0.57647
SP6 0.01212 *
as.integer(SEX) 0.08284 .
SP4 0.24894
SHS_6CLAlarge urban 0.38712
SHS_6CLAoth urban 0.24948
SHS_6CLAaccessible towns 0.57362
SHS_6CLAremote towns 0.51509
SHS_6CLAaccessible rural 0.64630
SHS_6CLAremote rural 0.75991
SP1:as.integer(SEX) 0.09839 .
SP2:as.integer(SEX) 0.00115 **
SP3:as.integer(SEX) 0.04321 *
as.integer(SEX):SP4 0.00551 **
SP5:as.integer(SEX) 3.84e-06 ***
SP6:as.integer(SEX) 3.77e-05 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
(Dispersion parameter for binomial family taken to be 0.9942185)
Number of Fisher Scoring iterations: 7
> summary(update(fit,~.+EMP_STA))
Call:
svyglm.survey.design(formula = INTUSE ~ SP1 + SP2 + SP3 + SP5 +
SP6 + as.integer(SEX) + SP4 + EMP_STA + SP1:as.integer(SEX) +
SP2:as.integer(SEX) + SP3:as.integer(SEX) + as.integer(SEX):SP4 +
SP5:as.integer(SEX) + SP6:as.integer(SEX) - 1, design = shs.des,
family = "binomial")
Survey design:
update.survey.design(shs.des, SP1 = SP1, SP2 = SP2, SP3 = SP3,
SP4 = SP4, SP5 = SP5, SP6 = SP6, AGE = AGE)
Coefficients:
Estimate
SP1 1.37213
SP2 1.53434
SP3 1.19930
SP5 0.70377
SP6 -0.76217
as.integer(SEX) 0.45314
SP4 0.49352
EMP_STASelf employed -0.75431
EMP_STAEmployed full time -0.91465
EMP_STAEmployed part time -1.33168
EMP_STALooking after the home or family -1.98307
EMP_STAPermanently retired from work -1.32620
EMP_STAUnemployed and seeking work -2.12990
EMP_STAAt school 0.02851
EMP_STAIn further/higher education 0.06199
EMP_STAGov't work or training scheme -1.73090
EMP_STAPermanently sick or disabled -2.60353
EMP_STAUnable to work because short-term ill -2.08311
EMP_STAOther -1.31233
SP1:as.integer(SEX) -0.64187
SP2:as.integer(SEX) -0.60068
SP3:as.integer(SEX) -0.52699
as.integer(SEX):SP4 -0.79712
SP5:as.integer(SEX) -2.07307
SP6:as.integer(SEX) -1.90606
Std. Error
SP1 0.66236
SP2 0.47252
SP3 0.57164
SP5 0.69562
SP6 0.70271
as.integer(SEX) 0.26240
SP4 0.54218
EMP_STASelf employed 0.43656
EMP_STAEmployed full time 0.43188
EMP_STAEmployed part time 0.43478
EMP_STALooking after the home or family 0.43602
EMP_STAPermanently retired from work 0.44424
EMP_STAUnemployed and seeking work 0.43651
EMP_STAAt school 0.43051
EMP_STAIn further/higher education 0.43056
EMP_STAGov't work or training scheme 0.62487
EMP_STAPermanently sick or disabled 0.44005
EMP_STAUnable to work because short-term ill 0.46833
EMP_STAOther 0.47788
SP1:as.integer(SEX) 0.40280
SP2:as.integer(SEX) 0.28808
SP3:as.integer(SEX) 0.35180
as.integer(SEX):SP4 0.33772
SP5:as.integer(SEX) 0.43702
SP6:as.integer(SEX) 0.47133
t value
SP1 2.072
SP2 3.247
SP3 2.098
SP5 1.012
SP6 -1.085
as.integer(SEX) 1.727
SP4 0.910
EMP_STASelf employed -1.728
EMP_STAEmployed full time -2.118
EMP_STAEmployed part time -3.063
EMP_STALooking after the home or family -4.548
EMP_STAPermanently retired from work -2.985
EMP_STAUnemployed and seeking work -4.879
EMP_STAAt school 0.066
EMP_STAIn further/higher education 0.144
EMP_STAGov't work or training scheme -2.770
EMP_STAPermanently sick or disabled -5.916
EMP_STAUnable to work because short-term ill -4.448
EMP_STAOther -2.746
SP1:as.integer(SEX) -1.594
SP2:as.integer(SEX) -2.085
SP3:as.integer(SEX) -1.498
as.integer(SEX):SP4 -2.360
SP5:as.integer(SEX) -4.744
SP6:as.integer(SEX) -4.044
Pr(>|t|)
SP1 0.03831 *
SP2 0.00117 **
SP3 0.03591 *
SP5 0.31168
SP6 0.27810
as.integer(SEX) 0.08420 .
SP4 0.36270
EMP_STASelf employed 0.08403 .
EMP_STAEmployed full time 0.03420 *
EMP_STAEmployed part time 0.00219 **
EMP_STALooking after the home or family 5.44e-06 ***
EMP_STAPermanently retired from work 0.00283 **
EMP_STAUnemployed and seeking work 1.07e-06 ***
EMP_STAAt school 0.94720
EMP_STAIn further/higher education 0.88552
EMP_STAGov't work or training scheme 0.00561 **
EMP_STAPermanently sick or disabled 3.33e-09 ***
EMP_STAUnable to work because short-term ill 8.70e-06 ***
EMP_STAOther 0.00603 **
SP1:as.integer(SEX) 0.11106
SP2:as.integer(SEX) 0.03707 *
SP3:as.integer(SEX) 0.13415
as.integer(SEX):SP4 0.01827 *
SP5:as.integer(SEX) 2.11e-06 ***
SP6:as.integer(SEX) 5.27e-05 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
(Dispersion parameter for binomial family taken to be 0.9990887)
Number of Fisher Scoring iterations: 7
> fit1<-svyglm(INTUSE~COUNCIL,design=shs.des) > fit2<-svyglm(INTUSE~COUNCIL+SP1+SP2+SP3+(as.integer(SEX)-1)+(as.integer(SEX)-1)*SP1+(as.integer(SEX)-1)*SP2+(as.integer(SEX)-1)*SP3, design=shs.des, family='binomial') > fit3<-svyglm(INTUSE~COUNCIL+SP1+SP2+SP3+(as.integer(SEX)-1)+(as.integer(SEX)-1)*SP1+(as.integer(SEX)-1)*SP2+(as.integer(SEX)-1)*SP3+GROUPINC, design=shs.des, family='binomial')
# this next bit compares ranking of adjusted and unadjusted # coefficients. It seems that this large variation between local # authorities is not explained by age sex or household income
> comp<-cbind(rank(-c(0,fit1$coefficients[2:32])),
+ rank(-fit2$coefficients[1:32]+fit2$coefficients[1]),
+ rank(-fit3$coefficients[1:32]+fit3$coefficients[1]))
> dimnames(comp)[[1]][1]<-'Aberdeen City'
> dimnames(comp)[[2]]<-c('Unadjusted','Age sex','Age sex wealth')
> print(comp)
Unadjusted Age sex
Aberdeen City 6 6
COUNCILAberdeenshire 10 11
COUNCILAngus 12 12
COUNCILArgyll & Bute 18 13
COUNCILClackmannanshire 24 26
COUNCILDumfries & Galloway 31 28
COUNCILDundee City 20 21
COUNCILEast Ayrshire 25 24
COUNCILEast Dunbartonshire 2 1
COUNCILEast Lothian 8 8
COUNCILEast Renfrewshire 4 4
COUNCILEdinburgh, City of 3 3
COUNCILEilean Siar 30 29
COUNCILFalkirk 15 14
COUNCILFife 16 16
COUNCILGlasgow City 29 31
COUNCILHighland 7 10
COUNCILInverclyde 26 22
COUNCILMidlothian 14 19
COUNCILMoray 23 25
COUNCILNorth Ayrshire 32 32
COUNCILNorth Lanarkshire 27 30
COUNCILOrkney Islands 22 20
COUNCILPerth & Kinross 9 7
COUNCILRenfrewshire 21 18
COUNCILScottish Borders 11 9
COUNCILShetland Islands 1 2
COUNCILSouth Ayrshire 17 15
COUNCILSouth Lanarkshire 19 23
COUNCILStirling 5 5
COUNCILWest Dunbartonshire 28 27
COUNCILWest Lothian 13 17
Age sex wealth
Aberdeen City 5
COUNCILAberdeenshire 13
COUNCILAngus 10
COUNCILArgyll & Bute 12
COUNCILClackmannanshire 30
COUNCILDumfries & Galloway 26
COUNCILDundee City 17
COUNCILEast Ayrshire 25
COUNCILEast Dunbartonshire 3
COUNCILEast Lothian 11
COUNCILEast Renfrewshire 9
COUNCILEdinburgh, City of 2
COUNCILEilean Siar 27
COUNCILFalkirk 14
COUNCILFife 16
COUNCILGlasgow City 24
COUNCILHighland 6
COUNCILInverclyde 19
COUNCILMidlothian 29
COUNCILMoray 21
COUNCILNorth Ayrshire 32
COUNCILNorth Lanarkshire 31
COUNCILOrkney Islands 18
COUNCILPerth & Kinross 7
COUNCILRenfrewshire 23
COUNCILScottish Borders 8
COUNCILShetland Islands 1
COUNCILSouth Ayrshire 15
COUNCILSouth Lanarkshire 28
COUNCILStirling 4
COUNCILWest Dunbartonshire 22
COUNCILWest Lothian 20
>