The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

saeproj.multilevel

Author

Nazlya Rahma Susanto, Azka Ubaidillah

Maintainer

Nazlya Rahma Susanto susantonazlya@gmail.com

Description

The saeproj.multilevel package provides tools for Small Area Estimation (SAE) using a projection estimator with a multilevel regression model.

The method is designed for two-survey settings:

The main function is:

sae_ml_linear()

The function fits a linear multilevel regression model using lme4::lmer(), generates unit-level predictions for the projection dataset, aggregates those predictions by domain using survey design information, and applies a design-based residual correction.

The final projection estimator is:

estimate_final = estimate_synthetic + correction

The plug-in variance is calculated as:

variance_final = variance_synthetic + variance_correction

The synthetic projection component and residual correction component are stored in:

result$estimation_details

Installation

The development version of saeproj.multilevel can be installed from GitHub with:

# install.packages("devtools")
devtools::install_github("rahmanazlya02/saeproj.multilevel")

To install the package together with the vignette, use:

# install.packages("devtools")
devtools::install_github(
  "rahmanazlya02/saeproj.multilevel",
  build_vignettes = TRUE,
  dependencies = TRUE
)

After installation, the vignette can be opened with:

browseVignettes("saeproj.multilevel")

Or directly:

vignette(
  "sae_ml_linear",
  package = "saeproj.multilevel"
)

Dependencies

The package imports:

Package datasets

The package includes two simulated datasets generated from one fixed replication of the study-simulation design.

data("saeml_modelsvy")
data("saeml_projsvy")

saeml_modelsvy

saeml_modelsvy is a small model-survey dataset containing:

saeml_projsvy

saeml_projsvy is a large projection-survey dataset containing:

The two datasets are drawn from the same simulated population and do not contain overlapping sampled units.

dim(saeml_modelsvy)
#> [1] 250  11

dim(saeml_projsvy)
#> [1] 15000    10

Example

Fit the multilevel projection estimator

result <- sae_ml_linear(
  formula = Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota),
  data_model = saeml_modelsvy,
  data_proj = saeml_projsvy,
  domain = "kab_kota",
  cluster_ids = ~1,
  weight = "WEIND",
  strata = "kab_kota",
  summary_function = "mean"
)

result
#> SAE Projection Estimator using Linear Multilevel Model
#> -------------------------------------------------------
#> Formula   : Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota) 
#> Estimator : bias_corrected 
#> Domains   : 50 
#> 
#> Estimates:
#>  kab_kota  estimate variance       se       rse
#>         1  63.63811 28.51940 5.340356  8.391758
#>         2 123.57033 22.92302 4.787799  3.874554
#>         3  72.21099 24.03748 4.902803  6.789553
#>         4  89.15406 25.01544 5.001543  5.610001
#>         5 160.68935 12.41104 3.522931  2.192386
#>         6  27.48805 28.16499 5.307070 19.306825

The package datasets do not contain a separate PSU or cluster variable. Therefore, the example uses:

cluster_ids = ~1

This specifies an unclustered survey-design structure. The variable id_individu is only a unique sampled-unit identifier and is not used as a PSU or cluster identifier.

Domain-level estimates

The final domain-level estimates are stored in:

result$estimates

The complete results for all 50 domains are shown below.

result$estimates
#>    kab_kota  estimate  variance       se       rse
#> 1         1  63.63811 28.519405 5.340356  8.391758
#> 2         2 123.57033 22.923017 4.787799  3.874554
#> 3         3  72.21099 24.037478 4.902803  6.789553
#> 4         4  89.15406 25.015436 5.001543  5.610001
#> 5         5 160.68935 12.411044 3.522931  2.192386
#> 6         6  27.48805 28.164991 5.307070 19.306825
#> 7         7 118.01107 21.596657 4.647220  3.937953
#> 8         8 154.32727 20.918597 4.573685  2.963627
#> 9         9  66.40287 19.156260 4.376787  6.591261
#> 10       10  89.89285 26.197321 5.118332  5.693814
#> 11       11  93.40441 18.723591 4.327077  4.632625
#> 12       12  67.82925 10.371817 3.220531  4.747996
#> 13       13  86.94722 26.877987 5.184398  5.962696
#> 14       14  83.26791 24.559496 4.955754  5.951577
#> 15       15 104.31824 28.927284 5.378409  5.155771
#> 16       16  66.99395 14.566786 3.816646  5.697001
#> 17       17 138.20477 44.228946 6.650485  4.812051
#> 18       18 146.17343 12.079225 3.475518  2.377667
#> 19       19  69.20977 30.322787 5.506613  7.956411
#> 20       20 126.71531 21.429139 4.629162  3.653198
#> 21       21  91.89536  8.232509 2.869235  3.122285
#> 22       22 112.26391 35.805903 5.983803  5.330122
#> 23       23  38.37135 13.554550 3.681650  9.594791
#> 24       24  54.02795 28.115349 5.302391  9.814163
#> 25       25 146.38489 41.543110 6.445395  4.403046
#> 26       26 119.26013 19.467277 4.412174  3.699622
#> 27       27 122.18386 30.941331 5.562493  4.552560
#> 28       28 114.81818 30.886520 5.557564  4.840317
#> 29       29 140.21555 27.966702 5.288355  3.771590
#> 30       30 114.57995 22.802072 4.775151  4.167528
#> 31       31  91.52510 43.345164 6.583704  7.193332
#> 32       32 102.80384 26.687399 5.165985  5.025090
#> 33       33 117.15727  9.750002 3.122499  2.665220
#> 34       34  81.85505 20.017747 4.474120  5.465906
#> 35       35  81.37672  9.574114 3.094207  3.802324
#> 36       36 121.88129  7.630933 2.762414  2.266479
#> 37       37  66.20806 43.124893 6.566955  9.918664
#> 38       38  90.88219 28.563450 5.344478  5.880666
#> 39       39  87.61008 17.579341 4.192772  4.785719
#> 40       40 149.73935 36.185367 6.015427  4.017266
#> 41       41 108.77503 12.750292 3.570755  3.282697
#> 42       42 154.02090 22.883156 4.783634  3.105834
#> 43       43 106.91171  9.739403 3.120802  2.919046
#> 44       44 142.66619 18.383221 4.287566  3.005313
#> 45       45 125.47587 52.515914 7.246786  5.775442
#> 46       46  94.25971 17.091366 4.134171  4.385936
#> 47       47 134.25627 36.781517 6.064777  4.517314
#> 48       48 116.44011 37.351694 6.111603  5.248710
#> 49       49  80.50337 24.459513 4.945656  6.143415
#> 50       50 133.66421 17.656474 4.201961  3.143669

The output contains:

Column Description
domain variable(s) Domain identifier column(s), based on the domain argument
estimate Final projection estimate with design-based residual correction
variance Plug-in variance of the final estimate
se Standard error, computed as sqrt(variance)
rse Relative standard error in percent

The same result can be extracted for further analysis with:

as.data.frame(result)

Estimation components

Detailed estimation components are stored in:

result$estimation_details

The complete synthetic estimate, residual correction, final estimate, variance, and sample-size information for all 50 domains are shown below.

result$estimation_details
#>    kab_kota estimate_synthetic variance_synthetic   correction
#> 1         1           64.51902           6.651059 -0.880903021
#> 2         2          123.47261           6.399579  0.097720077
#> 3         3           72.45427           5.914642 -0.243283358
#> 4         4           89.31018           6.307633 -0.156121828
#> 5         5          159.60585           6.707629  1.083499650
#> 6         6           29.12853           5.924376 -1.640481978
#> 7         7          117.95382           6.655086  0.057244068
#> 8         8          153.70964           5.881752  0.617629498
#> 9         9           67.29964           6.336749 -0.896767634
#> 10       10           90.47768           6.723465 -0.584833009
#> 11       11           93.35554           5.523737  0.048871257
#> 12       12           68.38506           5.808774 -0.555804610
#> 13       13           86.95638           5.906556 -0.009161651
#> 14       14           83.46482           6.117049 -0.196910212
#> 15       15          104.05296           5.361198  0.265282500
#> 16       16           68.09623           6.211223 -1.102279167
#> 17       17          137.62282           6.025534  0.581955378
#> 18       18          145.28490           5.861022  0.888529509
#> 19       19           69.77688           6.319282 -0.567113232
#> 20       20          126.46963           5.735366  0.245679453
#> 21       21           92.32333           5.985796 -0.427971400
#> 22       22          111.93106           6.367506  0.332843695
#> 23       23           39.62914           6.675530 -1.257790218
#> 24       24           54.97937           6.246625 -0.951418482
#> 25       25          145.57317           5.810129  0.811718138
#> 26       26          118.73939           5.431806  0.520735814
#> 27       27          121.93888           5.632564  0.244978471
#> 28       28          114.92443           5.067101 -0.106249134
#> 29       29          139.62463           6.424310  0.590921202
#> 30       30          114.38188           5.972599  0.198068985
#> 31       31           91.24777           5.591878  0.277322035
#> 32       32          102.51121           5.524387  0.292626541
#> 33       33          116.89962           6.666377  0.257653811
#> 34       34           82.00056           6.491236 -0.145510938
#> 35       35           82.03037           5.283640 -0.653657212
#> 36       36          121.87937           5.405497  0.001919269
#> 37       37           66.79017           6.181848 -0.582110617
#> 38       38           91.12162           5.891640 -0.239429982
#> 39       39           87.72478           6.084069 -0.114693188
#> 40       40          149.04234           5.802844  0.697014744
#> 41       41          108.43554           6.201553  0.339490042
#> 42       42          152.87854           5.714695  1.142356288
#> 43       43          107.17430           5.709964 -0.262587216
#> 44       44          141.97962           5.618465  0.686567860
#> 45       45          125.08834           7.204382  0.387531328
#> 46       46           94.20918           5.228550  0.050531652
#> 47       47          134.03805           6.232447  0.218213781
#> 48       48          116.21694           5.058848  0.223165144
#> 49       49           80.82393           5.787536 -0.320562289
#> 50       50          132.92864           7.120847  0.735570186
#>    variance_correction estimate_final variance_final se_final rse_final n_model
#> 1            21.868346       63.63811      28.519405 5.340356  8.391758       5
#> 2            16.523438      123.57033      22.923017 4.787799  3.874554       5
#> 3            18.122836       72.21099      24.037478 4.902803  6.789553       5
#> 4            18.707803       89.15406      25.015436 5.001543  5.610001       5
#> 5             5.703415      160.68935      12.411044 3.522931  2.192386       5
#> 6            22.240615       27.48805      28.164991 5.307070 19.306825       5
#> 7            14.941571      118.01107      21.596657 4.647220  3.937953       5
#> 8            15.036845      154.32727      20.918597 4.573685  2.963627       5
#> 9            12.819511       66.40287      19.156260 4.376787  6.591261       5
#> 10           19.473856       89.89285      26.197321 5.118332  5.693814       5
#> 11           13.199854       93.40441      18.723591 4.327077  4.632625       5
#> 12            4.563044       67.82925      10.371817 3.220531  4.747996       5
#> 13           20.971432       86.94722      26.877987 5.184398  5.962696       5
#> 14           18.442446       83.26791      24.559496 4.955754  5.951577       5
#> 15           23.566086      104.31824      28.927284 5.378409  5.155771       5
#> 16            8.355563       66.99395      14.566786 3.816646  5.697001       5
#> 17           38.203412      138.20477      44.228946 6.650485  4.812051       5
#> 18            6.218204      146.17343      12.079225 3.475518  2.377667       5
#> 19           24.003505       69.20977      30.322787 5.506613  7.956411       5
#> 20           15.693773      126.71531      21.429139 4.629162  3.653198       5
#> 21            2.246713       91.89536       8.232509 2.869235  3.122285       5
#> 22           29.438396      112.26391      35.805903 5.983803  5.330122       5
#> 23            6.879021       38.37135      13.554550 3.681650  9.594791       5
#> 24           21.868725       54.02795      28.115349 5.302391  9.814163       5
#> 25           35.732982      146.38489      41.543110 6.445395  4.403046       5
#> 26           14.035471      119.26013      19.467277 4.412174  3.699622       5
#> 27           25.308766      122.18386      30.941331 5.562493  4.552560       5
#> 28           25.819418      114.81818      30.886520 5.557564  4.840317       5
#> 29           21.542393      140.21555      27.966702 5.288355  3.771590       5
#> 30           16.829473      114.57995      22.802072 4.775151  4.167528       5
#> 31           37.753286       91.52510      43.345164 6.583704  7.193332       5
#> 32           21.163012      102.80384      26.687399 5.165985  5.025090       5
#> 33            3.083625      117.15727       9.750002 3.122499  2.665220       5
#> 34           13.526511       81.85505      20.017747 4.474120  5.465906       5
#> 35            4.290474       81.37672       9.574114 3.094207  3.802324       5
#> 36            2.225436      121.88129       7.630933 2.762414  2.266479       5
#> 37           36.943044       66.20806      43.124893 6.566955  9.918664       5
#> 38           22.671810       90.88219      28.563450 5.344478  5.880666       5
#> 39           11.495273       87.61008      17.579341 4.192772  4.785719       5
#> 40           30.382523      149.73935      36.185367 6.015427  4.017266       5
#> 41            6.548739      108.77503      12.750292 3.570755  3.282697       5
#> 42           17.168461      154.02090      22.883156 4.783634  3.105834       5
#> 43            4.029439      106.91171       9.739403 3.120802  2.919046       5
#> 44           12.764755      142.66619      18.383221 4.287566  3.005313       5
#> 45           45.311531      125.47587      52.515914 7.246786  5.775442       5
#> 46           11.862816       94.25971      17.091366 4.134171  4.385936       5
#> 47           30.549069      134.25627      36.781517 6.064777  4.517314       5
#> 48           32.292847      116.44011      37.351694 6.111603  5.248710       5
#> 49           18.671977       80.50337      24.459513 4.945656  6.143415       5
#> 50           10.535627      133.66421      17.656474 4.201961  3.143669       5
#>    n_proj
#> 1     300
#> 2     300
#> 3     300
#> 4     300
#> 5     300
#> 6     300
#> 7     300
#> 8     300
#> 9     300
#> 10    300
#> 11    300
#> 12    300
#> 13    300
#> 14    300
#> 15    300
#> 16    300
#> 17    300
#> 18    300
#> 19    300
#> 20    300
#> 21    300
#> 22    300
#> 23    300
#> 24    300
#> 25    300
#> 26    300
#> 27    300
#> 28    300
#> 29    300
#> 30    300
#> 31    300
#> 32    300
#> 33    300
#> 34    300
#> 35    300
#> 36    300
#> 37    300
#> 38    300
#> 39    300
#> 40    300
#> 41    300
#> 42    300
#> 43    300
#> 44    300
#> 45    300
#> 46    300
#> 47    300
#> 48    300
#> 49    300
#> 50    300

This table contains:

Column Description
domain variable(s) Domain identifier column(s)
estimate_synthetic Synthetic projection estimate
variance_synthetic Variance of the synthetic projection estimate
correction Design-based residual correction
variance_correction Variance of the residual correction
estimate_final Final estimate, computed as estimate_synthetic + correction
variance_final Final variance, computed as variance_synthetic + variance_correction
se_final Standard error of the final estimate
rse_final Relative standard error of the final estimate
n_model Number of observations in the domain in data_model
n_proj Number of observations in the domain in data_proj

Synthetic projection component

The function returns the projection estimator with a design-based residual correction by default.

The complete synthetic component for all 50 domains is available below.

result$estimation_details[, c(
  "kab_kota",
  "estimate_synthetic",
  "variance_synthetic"
)]
#>    kab_kota estimate_synthetic variance_synthetic
#> 1         1           64.51902           6.651059
#> 2         2          123.47261           6.399579
#> 3         3           72.45427           5.914642
#> 4         4           89.31018           6.307633
#> 5         5          159.60585           6.707629
#> 6         6           29.12853           5.924376
#> 7         7          117.95382           6.655086
#> 8         8          153.70964           5.881752
#> 9         9           67.29964           6.336749
#> 10       10           90.47768           6.723465
#> 11       11           93.35554           5.523737
#> 12       12           68.38506           5.808774
#> 13       13           86.95638           5.906556
#> 14       14           83.46482           6.117049
#> 15       15          104.05296           5.361198
#> 16       16           68.09623           6.211223
#> 17       17          137.62282           6.025534
#> 18       18          145.28490           5.861022
#> 19       19           69.77688           6.319282
#> 20       20          126.46963           5.735366
#> 21       21           92.32333           5.985796
#> 22       22          111.93106           6.367506
#> 23       23           39.62914           6.675530
#> 24       24           54.97937           6.246625
#> 25       25          145.57317           5.810129
#> 26       26          118.73939           5.431806
#> 27       27          121.93888           5.632564
#> 28       28          114.92443           5.067101
#> 29       29          139.62463           6.424310
#> 30       30          114.38188           5.972599
#> 31       31           91.24777           5.591878
#> 32       32          102.51121           5.524387
#> 33       33          116.89962           6.666377
#> 34       34           82.00056           6.491236
#> 35       35           82.03037           5.283640
#> 36       36          121.87937           5.405497
#> 37       37           66.79017           6.181848
#> 38       38           91.12162           5.891640
#> 39       39           87.72478           6.084069
#> 40       40          149.04234           5.802844
#> 41       41          108.43554           6.201553
#> 42       42          152.87854           5.714695
#> 43       43          107.17430           5.709964
#> 44       44          141.97962           5.618465
#> 45       45          125.08834           7.204382
#> 46       46           94.20918           5.228550
#> 47       47          134.03805           6.232447
#> 48       48          116.21694           5.058848
#> 49       49           80.82393           5.787536
#> 50       50          132.92864           7.120847

Direct estimator

Set return_direct = TRUE to return direct design-based estimates from data_model.

result_direct <- sae_ml_linear(
  formula = Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota),
  data_model = saeml_modelsvy,
  data_proj = saeml_projsvy,
  domain = "kab_kota",
  cluster_ids = ~1,
  weight = "WEIND",
  strata = "kab_kota",
  summary_function = "mean",
  return_direct = TRUE
)

result_direct$direct_estimator

The direct estimator is stored separately and does not replace the projection estimator.

A concise output can be displayed with:

print(result)
#> SAE Projection Estimator using Linear Multilevel Model
#> -------------------------------------------------------
#> Formula   : Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota) 
#> Estimator : bias_corrected 
#> Domains   : 50 
#> 
#> Estimates:
#>  kab_kota  estimate variance       se       rse
#>         1  63.63811 28.51940 5.340356  8.391758
#>         2 123.57033 22.92302 4.787799  3.874554
#>         3  72.21099 24.03748 4.902803  6.789553
#>         4  89.15406 25.01544 5.001543  5.610001
#>         5 160.68935 12.41104 3.522931  2.192386
#>         6  27.48805 28.16499 5.307070 19.306825

A compact summary can be displayed with:

summary(result)
#> SAE Projection Estimator using Linear Multilevel Model
#> -------------------------------------------------------
#> Formula   : Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota) 
#> Estimator : bias_corrected 
#> Domains   : 50 
#> 
#> Model diagnostics:
#>   nobs        : 250 
#>   sigma       : 9.6444 
#>   ICC         : 0.9048 
#>   singular    : FALSE 
#>   convergence : OK 
#> 
#> Estimates:
#>  kab_kota  estimate variance       se       rse
#>         1  63.63811 28.51940 5.340356  8.391758
#>         2 123.57033 22.92302 4.787799  3.874554
#>         3  72.21099 24.03748 4.902803  6.789553
#>         4  89.15406 25.01544 5.001543  5.610001
#>         5 160.68935 12.41104 3.522931  2.192386
#>         6  27.48805 28.16499 5.307070 19.306825

The summary() method displays the formula, estimator type, number of domains, selected model diagnostics, and a preview of the final estimates.

Full model output can be accessed from the fitted lmerMod object:

fit <- result$fitted_model

summary(fit)
#> Linear mixed model fit by REML ['lmerMod']
#> Formula: Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota)
#>    Data: data
#> Control: control
#> 
#> REML criterion at convergence: 2009.9
#> 
#> Scaled residuals: 
#>      Min       1Q   Median       3Q      Max 
#> -2.16963 -0.59140  0.04972  0.52613  2.44401 
#> 
#> Random effects:
#>  Groups   Name        Variance Std.Dev.
#>  kab_kota (Intercept) 884.17   29.735  
#>  Residual              93.01    9.644  
#> Number of obs: 250, groups:  kab_kota, 50
#> 
#> Fixed effects:
#>             Estimate Std. Error t value
#> (Intercept)  92.4309     4.4555  20.745
#> X1           25.1077     0.6709  37.422
#> X2           18.8027     1.3788  13.637
#> X3          -22.5309     0.6800 -33.133
#> X4           20.4876     0.5781  35.439
#> Z1           -9.6485     4.3391  -2.224
#> Z2           -6.1241     4.8901  -1.252
#> 
#> Correlation of Fixed Effects:
#>    (Intr) X1     X2     X3     X4     Z1    
#> X1 -0.003                                   
#> X2 -0.155 -0.023                            
#> X3 -0.019 -0.007  0.010                     
#> X4  0.005  0.003  0.051  0.109              
#> Z1  0.253 -0.018 -0.004 -0.007  0.006       
#> Z2 -0.054 -0.017  0.003 -0.012  0.024 -0.024

Retaining unit-level predictions

Set keep_unit = TRUE to store unit-level projection data and model residual data.

result_ku <- sae_ml_linear(
  formula = Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota),
  data_model = saeml_modelsvy,
  data_proj = saeml_projsvy,
  domain = "kab_kota",
  cluster_ids = ~1,
  weight = "WEIND",
  strata = "kab_kota",
  summary_function = "mean",
  keep_unit = TRUE
)

head(result_ku$unit_projection)
head(result_ku$unit_model_residual)

When keep_unit = TRUE:

Model diagnostics

Model diagnostics are stored in:

result$diagnostics
data.frame(
  icc = result$diagnostics$icc,
  singular_fit = result$diagnostics$singular_fit,
  convergence = result$diagnostics$convergence,
  sigma = result$diagnostics$sigma,
  residual_variance = result$diagnostics$residual_variance,
  REML = result$diagnostics$REML,
  AIC = result$diagnostics$AIC,
  BIC = result$diagnostics$BIC
)
#>         icc singular_fit convergence    sigma residual_variance REML      AIC
#> 1 0.9048142        FALSE          OK 9.644356           93.0136 TRUE 2027.936
#>        BIC
#> 1 2059.629

The estimated random effects for all domain groups can be inspected directly:

lme4::ranef(result$fitted_model)$kab_kota
#>     (Intercept)
#> 1  -41.86827839
#> 2    4.64451965
#> 3  -11.56297019
#> 4   -7.42028578
#> 5   51.49745648
#> 6  -77.97016757
#> 7    2.72074285
#> 8   29.35519933
#> 9  -42.62230470
#> 10 -27.79642104
#> 11   2.32279301
#> 12 -26.41673557
#> 13  -0.43544244
#> 14  -9.35890943
#> 15  12.60856337
#> 16 -52.39002472
#> 17  27.65965064
#> 18  42.23075634
#> 19 -26.95422097
#> 20  11.67685373
#> 21 -20.34097431
#> 22  15.81966705
#> 23 -59.78128098
#> 24 -45.21979483
#> 25  38.58000279
#> 26  24.74995717
#> 27  11.64353691
#> 28  -5.04989563
#> 29  28.08578562
#> 30   9.41398453
#> 31  13.18078825
#> 32  13.90819327
#> 33  12.24598079
#> 34  -6.91596274
#> 35 -31.06755394
#> 36   0.09122059
#> 37 -27.66702893
#> 38 -11.37982376
#> 39  -5.45123152
#> 40  33.12828614
#> 41  16.13556004
#> 42  54.29484285
#> 43 -12.48045973
#> 44  32.63175812
#> 45  18.41890554
#> 46   2.40170965
#> 47  10.37144283
#> 48  10.60677527
#> 49 -15.23594635
#> 50  34.96078070

Residual diagnostics can be inspected from the fitted model:

fit <- result$fitted_model

plot(
  fitted(fit),
  resid(fit),
  xlab = "Fitted values",
  ylab = "Residuals",
  main = "Residuals vs Fitted"
)

abline(h = 0, lty = 2)

qqnorm(resid(fit))
qqline(resid(fit))

Model parameters

Estimated model parameters are stored in:

result$model_parameters
result$model_parameters$fixed_effects
#> (Intercept)          X1          X2          X3          X4          Z1 
#>   92.430911   25.107730   18.802686  -22.530931   20.487619   -9.648481 
#>          Z2 
#>   -6.124119

result$model_parameters$variance_components
#>        grp        var1 var2     vcov     sdcor
#> 1 kab_kota (Intercept) <NA> 884.1652 29.734916
#> 2 Residual        <NA> <NA>  93.0136  9.644356

result$model_parameters$residual_variance
#> [1] 93.0136

Notes

Run-specific notes are stored in:

result$notes
#> character(0)

The notes are intentionally concise and are not printed automatically by summary().

They may include information such as:

Out-of-sample domains are not treated as warnings because they are expected in SAE projection. They are recorded in result$notes.

Multiple domain variables

The domain argument accepts a character scalar, a character vector, or a one-sided formula.

The following example uses both prov and kab_kota as domain identifiers.

result_multi <- sae_ml_linear(
  formula = Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota),
  data_model = saeml_modelsvy,
  data_proj = saeml_projsvy,
  domain = c("prov", "kab_kota"),
  cluster_ids = ~1,
  weight = "WEIND",
  strata = "kab_kota",
  summary_function = "mean"
)

result_multi$estimates

Survey design specification

The arguments cluster_ids, weight, and strata are used in the aggregation step through survey::svydesign().

Simulated package data

The simulated datasets included in the package do not contain a separate PSU or cluster variable. Therefore, the package examples use:

cluster_ids = ~1
weight = "WEIND"
strata = "kab_kota"

Here, cluster_ids = ~1 specifies an unclustered survey-design structure.

Survey data with PSU clustering

For a real survey with a PSU or cluster variable, provide the actual PSU identifier in cluster_ids.

The following code is illustrative. Replace psu_id, survey_weight, and stratum with the corresponding variable names in your data.

result_clustered <- sae_ml_linear(
  formula = Y ~ X1 + X2 + X3 + X4 + Z1 + Z2 + (1 | kab_kota),
  data_model = data_model,
  data_proj = data_proj,
  domain = "kab_kota",
  cluster_ids = "psu_id",
  weight = "survey_weight",
  strata = "stratum",
  summary_function = "mean",
  nest = TRUE
)

In this specification:

Use cluster_ids = ~1 when the survey design does not include a separate PSU or cluster variable.

Output object structure

sae_ml_linear() returns an S3 object of class "sae_ml_linear".

Typical components are:

Component Description
$call The matched function call
$formula The model formula used after preprocessing
$estimator Estimator type; currently always "bias_corrected"
$fitted_model The fitted lmerMod object from lme4::lmer()
$model_parameters Fixed effects, random effects, variance components, residual SD, and residual variance
$estimates Final domain-level estimates
$estimation_details Synthetic estimate, correction, final estimate, and sample sizes per domain
$diagnostics Model diagnostics: ICC when applicable, random-effect structure, singular fit, convergence, sigma, residual variance, REML, logLik, AIC, and BIC
$notes Concise run-specific notes
$unit_projection Unit-level data_proj with .prediction, only if keep_unit = TRUE
$unit_model_residual Unit-level data_model with .fitted_model and .model_residual, only if keep_unit = TRUE
$direct_estimator Direct design-based estimates, only if return_direct = TRUE

S3 methods

Method Behaviour
print(result) Prints formula, estimator, number of domains, and a preview of $estimates
summary(result) Prints selected diagnostics and a preview of final estimates
as.data.frame(result) Returns result$estimates

Function interface

sae_ml_linear(
  formula,
  data_model,
  data_proj,
  domain,
  cluster_ids = ~1,
  weight = NULL,
  strata = NULL,
  summary_function = "mean",
  keep_unit = FALSE,
  seed = 1,
  control = lme4::lmerControl(
    optimizer = "bobyqa",
    optCtrl = list(maxfun = 2e5)
  ),
  return_direct = FALSE,
  ...
)
Argument Description
formula lme4::lmer()-style formula containing at least one random-effect term
data_model Model survey data frame containing the response, predictors, grouping variables, domain variable(s), and survey design variables
data_proj Projection survey data frame containing predictors, grouping variables, domain variable(s), and survey design variables; the response is not required
domain Domain variable name(s): character scalar, character vector, or one-sided formula
cluster_ids PSU or cluster variable for survey design; use ~1 for no clustering
weight Survey weight variable; use NULL for equal weights
strata Stratification variable; use NULL if not applicable
summary_function Domain-level statistic: "mean" or "total"
keep_unit If TRUE, unit-level predictions and residuals are stored in the output
seed Integer seed used before model fitting
control lme4::lmerControl() object passed to lme4::lmer()
return_direct If TRUE, direct design-based estimates from data_model are returned
... Additional named arguments passed to survey::svydesign(), for example nest = TRUE

The weight argument identifies the survey weight column used in both data_model and data_proj. The column name must be the same in both datasets, but the weight values may differ.

In data_model, weights are used for residual correction and optional direct estimation. In data_proj, weights are used for synthetic projection aggregation.

Methodological notes

Summary function

References

Bates, D., Maechler, M., Bolker, B., & Walker, S. (2015). Fitting linear mixed-effects models using lme4. Journal of Statistical Software, 67(1), 1–48.

Finch, W. H., Bolin, J. E., & Kelley, K. (2014). Multilevel Modeling Using R. CRC Press.

Food and Agriculture Organization of the United Nations. (2021). Guidelines on Data Disaggregation for SDG Indicators Using Survey Data (1st ed.). https://doi.org/10.4060/cb3253en

Hox, J. J., Moerbeek, M., & van de Schoot, R. (2018). Multilevel Analysis: Techniques and Applications (3rd ed.). Routledge.

Kim, J. K., & Rao, J. N. K. (2012). Combining data from two independent surveys: A model-assisted approach. Biometrika, 99(1), 85–100.

Moura, F. A. S., & Holt, D. (1999). Small area estimation using multilevel models. Survey Methodology, 25(1), 73–80.

Rao, J. N. K., & Molina, I. (2015). Small Area Estimation (2nd ed.). Wiley.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.