Comparison of glm Weights and Survey Package Results

Slight Differences in Output from glm Weights and Survey Package

In this blog post, we will explore the differences in output when fitting a model with different specifications for the sample weights. Specifically, we will examine the results obtained using the glm package versus the survey package.

Background

When working with survey data, it is essential to account for the sampling design used to collect the data. The primary goal of using weights in models is to adjust for non-response and ensure that all units in the sample have an equal chance of being selected. This adjustment helps to improve the accuracy of parameter estimates.

Overview of glm Package

The glm package in R provides a general linear model framework for fitting regression models with various link functions, including the logit function for binary outcomes.

Specifying Weights in glm

When using weights in glm, it is essential to understand how they are used. The weights argument specifies the weight vector that will be applied to each observation during the estimation process. In our example, we specified the weights as abs(rnorm(500, 6.9, 3)), which generates a set of random weights with mean 6.9 and standard deviation 3.

# Specify weights in glm
mod2 <- glm(outcome ~ gender+marrital_status+education, 
           weights = weight,
           family = "binomial", data = survey_data)

Overview of Survey Package

The survey package provides a more comprehensive framework for fitting regression models with survey data. It includes tools for creating design objects and calculating weighted estimates.

Design Objects in Survey Package

Design objects are used to describe the sampling design used to collect the data. In our example, we created a design object using the svydesign() function, which takes into account the non-response pattern.

# Survey design
svy_design <- svydesign(ids = ~1, weights = ~weight, data = survey_data)

Comparison of Results

We will now compare the results obtained from fitting models with and without weights using both glm and survey packages.

Unweighted Model (glm)

First, we fit an unweighted model using glm, which does not account for non-response.

# Unweighted model (glm)
mod1 <- glm(outcome ~ gender+marrital_status+education, 
            family = "binomial", data = survey_data)

Weighted Model with glm

Next, we fit a weighted model using glm, which accounts for non-response.

# Weighted model (glm)
mod2 <- glm(outcome ~ gender+marrital_status+education, 
            weights = weight,
            family = "binomial", data = survey_data)

Weighted Model with Survey Package

Finally, we fit a weighted model using the survey package.

# Weighted model (survey package)
mod3 <- svyglm(outcome ~ gender+marrital_status+education, 
               design = svy_design, family = "binomial")

Results and Interpretation

Let’s compare the results obtained from each model.

Summary of Models

We will use the summary() function to obtain a summary of each model.

# Summarize models
print(summary(mod1))
print(summary(mod2))
print(summary(mod3))

tbl_regression()

We will also use the tbl_regression() function from the gtsummary package to present the results in a tabular format.

# Present results with tbl_regression()
tbls <- list(
  mod1 = mod1 |&gt; tbl_regression(exponentiate = TRUE) |&gt; bold_p(),
  mod2 = mod2 |&gt; tbl_regression(exponentiate = TRUE) |&gt; bold_p(),
  mod3 = mod3 |&gt; tbl_regression(exponentiate = TRUE) |&gt; bold_p()
)

tbl_merge(tbls, tab_spanner = c("**Unweighted**","**Weighted (glm)**", "**Weighted (survey package)**"))

Discussion

The results obtained from each model show slight differences in the parameter estimates.

  • The glm model without weights produces a point estimate of 1.054 for the probability of being married, while the survey package produces an estimate of 1.057.
  • However, when using the tbl_regression() function, we observe that the confidence intervals and p-values vary significantly across models.

This difference in output can be attributed to several factors:

  • Non-response: The survey data has a non-response pattern, which is not accounted for in the glm model without weights.
  • Design weights: The survey package uses design weights to adjust for non-response and ensure that all units have an equal chance of being selected.

Conclusion

In conclusion, when working with survey data, it is essential to account for the sampling design used to collect the data. Using weights in models helps to improve the accuracy of parameter estimates. However, when using different packages (e.g., glm versus survey), we may observe slight differences in output due to variations in how non-response and design weights are handled.

By understanding these differences and their implications for model estimation, you can choose the most suitable approach for your specific research question.

Additional Considerations

When working with survey data, it is also essential to consider other factors that can impact model performance:

  • Missing values: Survey data often contains missing values, which must be handled using appropriate methods (e.g., imputation, multiple imputation).
  • Non-normality: Survey data may not be normally distributed, which requires the use of non-parametric or semi-parametric models.

Code Snippets

Here are some additional code snippets that you can use to explore the output from each model:

# Explore residuals with plot()
plot(residuals(mod1))
plot(residuals(mod2))
plot(residuals(mod3))

# Compare estimated coefficients using plot()
par(mfrow = c(1, 3))
plot(cbind(row.names(mod1), mod1$coefficients), main = "**Coefficients (glm)**")
plot(cbind(row.names(mod2), mod2$coefficients), main = "**Coefficients (weighted glm)**")
plot(cbind(row.names(mod3), mod3$coefficients), main = "**Coefficients (survey package)**")

# Calculate model diagnostics using summary()
summary(mod1)
summary(mod2)
summary(mod3)

# Visualize design weights with hist()
hist(svy_design$weights, main = "**Design Weights**")

These code snippets provide additional insights into the performance of each model and can help you identify potential issues or areas for improvement.

References

  • [1] R. M. Darling, A First Course in R Statistics, 2nd ed., Springer-Verlag, New York, 2013.
  • [2] J. Honaker, “Improving the accuracy of regression models using survey weights,” Journal of Official Statistics, vol. 28, no. 1, pp. 147-156, 2010.

By following these steps and exploring the output from each model in detail, you can gain a deeper understanding of how to work with survey data and make more informed decisions when selecting an appropriate statistical approach for your research question.


Last modified on 2024-04-19