With the recent rise of new weight loss drugs, particularly GLP-1 receptor antagonists like Ozempic & Wegovy, understanding demographic and attitudinal factors that may contribute to increased skepticism/pessimism towards the efficacy, utility and potential positive impact of these drugs may have useful clinical and public health implications.
This project uses publicly-available survey data from the American Trends Panel Wave 142 by the Pew Research Center published in 2024. The survey gathers opinions from around 10,000 participants on a variety of topical subjects ranging from cryptocurrency to ChatGPT. The current study will analyze responses from the survey that pertain to evaluating public perception of GLP-1 receptor antagonists,as well as which factors contribute to higher levels of skepticism of the drugs.
Data were collected from the American Trends Panel Wave 142 by the Pew Research Center published in 2024. A variety of demographic variables (e.g. gender, income, political party) and attitudinal/perceptual variables (e.g. belief of genetic factors in weight issues) were analyzed to evaluate predictors of increased skepticism towards the utility and efficacy of new weight loss medications like Ozempic. Perceived skepticism/pessimism towards the drugs was measured through participants’ responses to the following two survey questions:
(Support/Skepticism) Do you think Ozempic, Wegovy and other similar drugs are good options for weight loss for people with obesity or other weight-related health issues? (1 = Yes, 2 = Not sure, 3 = No)
(Optimism/Pessimism) Over the long run, how much do you think Ozempic, Wegovy and other similar drugs will do to reduce obesity in America? (1 = Significant, 2 = Somewhat, 3 = Barely, 4 = Nothing)
Responses to question one will be saved under an outcome variable named opinion_collapsed. Responses are coded from 1-3 with higher scores indicating higher levels of skepticism.
Responses to question two will be saved under an outcome variable named OZUSE_a_W142. Responses are coded from 1-4 with higher scores indicating higher levels of pessimism.
The demographic/attitudinal predictor variables that will be used to compute our logistic models are listed below below:
Predictor Variables
gender - (1 = Male, 2 = Female, 3 = Non-binary)
partylean - (1 = Republican, 2 = Democrat)
income_score - (1 = Lower Income, 2 = Middle Income, 3 = High Income))
OZread - Measures self-reported level of exposure to information about drugs like Ozempic.The question evaluating this variable reads: “How much have you read or heard about Ozempic, Wegovy or other drugs that are being used for weight loss?” (1 = A little, 2 = A lot)
genetics_collapsed - Measures the extent to which participants believe obesity can be causally attributed to genetics. The question that measures this variable reads: “How much do you think genetics affects a person’s weight?” (1 = Low, 2 = Some, 3 = Quite a lot, 4 = A great deal)
My hypotheses are as follows:
H1: Women will be more pessimistic and skeptical of the new wave of drugs due to being the target demographic of multiple failed weight loss medications over the past few decades.
H2: Less belief in genetic component to weight gain will lead to increase in negative pessimism and skepticism towards weight loss drugs like Ozempic.
H3: Reading and hearing less about drugs like Ozempic will be associated with and increase in negative attitudes towards the medication.
H4: Republicans will be more skeptical of drugs like Ozempic, due to a higher level of distrust in scientists and healthcare institutions in general.
H5: Higher income group will be associated with greater optimisim and trust in the new wave of weight loss drugs due to a higher likelihood of obtaining the medications at their high price point.
Variables relevant to opinions on GLP-1 medications and weight, as well as other demographic variables, were selected from the American Trends Panel data and saved into a separate dataset. Variables were renamed for easier interpretation and filtered to exclude responses where participants refused to respond. The dataset was then filtered to exclude any NA values. The final dataset was named ozempic_survey_data_clean and contained responses from 2155 participants (n = 2155).
# CLEANING DATA, REMOVING NA VALUES AND CREATING FACTORS W/ LEVELS FOR EACH VARIABLE
ozempic_survey_data <- ATP_W142 %>%
dplyr::select(ozempic_opinion = REDUCOBES_W142, income_score = F_INC_TIER2,
genetics = FACTWGT_a_W142, OZread = OZHEARD_W142, OZUSE_a_W142,
partylean = F_PARTYLN_FINAL, gender = F_GENDER) %>%
filter(ozempic_opinion < 6, income_score < 98, genetics < 98,
OZread < 98, partylean < 98, gender < 3, OZUSE_a_W142 < 98)
ozempic_survey_data_clean <- na.omit(ozempic_survey_data)
kable(head(ozempic_survey_data_clean))
ozempic_opinion | income_score | genetics | OZread | OZUSE_a_W142 | partylean | gender |
---|---|---|---|---|---|---|
4 | 2 | 2 | 2 | 2 | 2 | 1 |
4 | 3 | 1 | 1 | 1 | 1 | 2 |
2 | 1 | 1 | 1 | 1 | 2 | 2 |
5 | 2 | 3 | 2 | 2 | 1 | 2 |
4 | 2 | 2 | 1 | 3 | 1 | 1 |
3 | 3 | 3 | 2 | 1 | 1 | 1 |
Variables were then saved as ordered factors with defined levels. The code where this was perforeed is supplied below (click ‘show’ to see the code). The outcome variables were reverse-coded such that higher numbers = higher levels of skepticism towards new weight loss medications. Predictor variables were forward-coding with higher numbers = more of the variable (e.g. higher number in income_score = higher income).
A summary of all the variables and number of responses for each answer choice is shown in the output below.
# Createing Ordered Factors + Defining Levels
ozempic_survey_data_clean$ozempic_opinion <-
factor(ozempic_survey_data_clean$ozempic_opinion, ordered = TRUE,
levels = c(1,2,3,4,5,6, 99),
labels = c("A great deal", "Quite a bit", "Some",
"Not too much", "Nothing at all", "Not sure", "Refused"))
ozempic_survey_data_clean$OZUSE_a_W142 <-
factor(ozempic_survey_data_clean$OZUSE_a_W142, ordered = TRUE,
levels=c(1,2,3,99),
labels = c("Yes", "Not sure", "No", "Refused"))
ozempic_survey_data_clean$income_score <-
factor(ozempic_survey_data_clean$income_score, ordered = TRUE,
levels = c(1,2,3,99),
labels = c("Lower Income", "Middle Income", "Upper Income", "Refused"))
ozempic_survey_data_clean$genetics <-
factor(ozempic_survey_data_clean$genetics, ordered = TRUE,
levels = c(99,5,4,3,2,1),
labels = c("Refused", "Not at all", "Not too much",
"Some", "Quite a bit", "A great deal"))
ozempic_survey_data_clean$OZread <-
factor(ozempic_survey_data_clean$OZread, ordered = TRUE,
levels = c(99,3,2,1),
labels = c("Refused", "Nothing at all", "A little", "A lot"))
ozempic_survey_data_clean$partylean <-
factor(ozempic_survey_data_clean$partylean, ordered = TRUE,
levels = c(1,2,99),
labels =c("Republican", "Democrat", "Refused"))
ozempic_survey_data_clean$gender <-
factor(ozempic_survey_data_clean$gender, ordered = TRUE,
levels=c(1,2,3,99),
labels = c("Male", "Female", "Non-binary", "Refused"))
str(ozempic_survey_data_clean) # Ensuring all variables are properly stored as factors
## tibble [2,155 × 7] (S3: tbl_df/tbl/data.frame)
## $ ozempic_opinion: Ord.factor w/ 7 levels "A great deal"<..: 4 4 2 5 4 3 2 4 4 2 ...
## $ income_score : Ord.factor w/ 4 levels "Lower Income"<..: 2 3 1 2 2 3 3 3 1 1 ...
## $ genetics : Ord.factor w/ 6 levels "Refused"<"Not at all"<..: 5 6 6 4 5 4 4 5 5 5 ...
## $ OZread : Ord.factor w/ 4 levels "Refused"<"Nothing at all"<..: 3 4 4 3 4 3 3 3 4 4 ...
## $ OZUSE_a_W142 : Ord.factor w/ 4 levels "Yes"<"Not sure"<..: 2 1 1 2 3 1 3 1 1 1 ...
## $ partylean : Ord.factor w/ 3 levels "Republican"<"Democrat"<..: 2 1 2 1 1 1 1 1 1 2 ...
## $ gender : Ord.factor w/ 4 levels "Male"<"Female"<..: 1 2 2 2 1 1 2 1 2 1 ...
summary(ozempic_survey_data_clean)
## ozempic_opinion income_score genetics
## A great deal : 75 Lower Income : 428 Refused : 0
## Quite a bit :317 Middle Income:1118 Not at all : 17
## Some :882 Upper Income : 609 Not too much: 91
## Not too much :757 Refused : 0 Some :770
## Nothing at all:124 Quite a bit :829
## Not sure : 0 A great deal:448
## Refused : 0
## OZread OZUSE_a_W142 partylean gender
## Refused : 0 Yes :1302 Republican: 995 Male :1111
## Nothing at all: 0 Not sure: 403 Democrat :1160 Female :1044
## A little :1310 No : 450 Refused : 0 Non-binary: 0
## A lot : 845 Refused : 0 Refused : 0
##
##
##
Next, answer choices that were selected by 0 participants were dropped from the dataset. Answer choices with low numbers of observations were collapsed (combined) when it made logical sense. For example, the genetics_collapsed had very low observations in the ‘Not at all’ group (n = 17) and the ‘Not too much’ group (n = 91). These two groups were combined into a new group, ‘Low’ (n = 108).
# Dropping factor levels with excluded observations
ozempic_survey_data_clean <- droplevels(ozempic_survey_data_clean)
# Collapsing levels in response categories with low observations.
ozempic_survey_data_clean$genetics_collapsed <- fct_collapse(
ozempic_survey_data_clean$genetics,
Low = c("Not too much", "Not at all"),
Some = "Some",
"Quite a bit" = "Quite a bit",
"A great deal" = "A great deal"
)
ozempic_survey_data_clean$opinion_collapsed <- fct_collapse(
ozempic_survey_data_clean$ozempic_opinion,
"A lot" = c("Quite a bit", "A great deal"),
Some = "Some",
"Not too much" = "Not too much",
"Nothing at all" = "Nothing at all"
) # Combined 'A great deal' and "'Quite a bit' groups to account for low observations.
The finalized factor levels and first 6 rows of the cleaned dataset are shown below.
summary(ozempic_survey_data_clean) #Making sure the data looks good.
## ozempic_opinion income_score genetics OZread
## A great deal : 75 Lower Income : 428 Not at all : 17 A little:1310
## Quite a bit :317 Middle Income:1118 Not too much: 91 A lot : 845
## Some :882 Upper Income : 609 Some :770
## Not too much :757 Quite a bit :829
## Nothing at all:124 A great deal:448
## OZUSE_a_W142 partylean gender genetics_collapsed
## Yes :1302 Republican: 995 Male :1111 Low :108
## Not sure: 403 Democrat :1160 Female:1044 Some :770
## No : 450 Quite a bit :829
## A great deal:448
##
## opinion_collapsed
## A lot :392
## Some :882
## Not too much :757
## Nothing at all:124
##
kable(head(ozempic_survey_data_clean)) # Viewing the head of the cleaned dataset
ozempic_opinion | income_score | genetics | OZread | OZUSE_a_W142 | partylean | gender | genetics_collapsed | opinion_collapsed |
---|---|---|---|---|---|---|---|---|
Not too much | Middle Income | Quite a bit | A little | Not sure | Democrat | Male | Quite a bit | Not too much |
Not too much | Upper Income | A great deal | A lot | Yes | Republican | Female | A great deal | Not too much |
Quite a bit | Lower Income | A great deal | A lot | Yes | Democrat | Female | A great deal | A lot |
Nothing at all | Middle Income | Some | A little | Not sure | Republican | Female | Some | Nothing at all |
Not too much | Middle Income | Quite a bit | A lot | No | Republican | Male | Quite a bit | Not too much |
Some | Upper Income | Some | A little | Yes | Republican | Male | Some | Some |
Before computing the logistic regression models, data were visualized to get an idea of what sort of trends or relationships exist between our variables. What demographic features make someone more optimistic about new weight loss drugs like Ozempic and their future impact on obesity in America? What makes them more skeptical?
The figures above suggest that most people surveyed believe that weight
loss drugs like Ozempic are a good option for individuals with obesity
or weight-related health issues, and that drugs like Ozempic will have
at least some impact on reducing obesity in America. Most
people seem to be optimistic about these medications, but what are the
factors that make some people more skeptical/pessimistic?
The figures below visualize how the 5 predictor variables in this study are related to participant’s responses to the question: “Over the long run, how much do you think Ozempic and other similar drugs will do to reduce obesity in America?”
# Visualizing Gender Differences
gender_plot <-
ggplot(ozempic_survey_data_clean, aes(x = opinion_collapsed, fill = gender)) +
geom_bar(position = "fill") +
labs(title = "Over the long run, how much do you think Ozempic and other\nsimilar drugs will do to reduce obesity in America?",
x = "More Pessimism -->",
y = "Response Percentage",
fill = "Gender") +
theme_minimal() +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer()+
scale_y_continuous(labels = scales::percent)
# Visualising Differences in Belief of Genetic Factor in Weight Gain
genetic_plot <-
ggplot(ozempic_survey_data_clean, aes(x = opinion_collapsed, fill = genetics_collapsed)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Over the long run, how much do you think Ozempic and other\nsimilar drugs will do to reduce obesity in America?",
x = "More Pessimism -->",
y = "Response Percentage",
fill = "How big of a role\ndoes genetics play\nin weight gain?") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing Income Differences
income_plot <-
ggplot(ozempic_survey_data_clean, aes(x = opinion_collapsed, fill = income_score)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Over the long run, how much do you think Ozempic and other\nsimilar drugs will do to reduce obesity in America?",
x = "More Pessimism -->",
y = "Response Percentage",
fill = "Income Group")+
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
axis.title.y = element_text(face = "bold"),
axis.text = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing Political Party Differences
party_plot <-
ggplot(ozempic_survey_data_clean, aes(x = opinion_collapsed, fill = partylean)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Over the long run, how much do you think Ozempic and other\nsimilar drugs will do to reduce obesity in America?",
x = "More Pessimism -->",
y = "Response Percentage",
fill = "Politcal Party") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing Differences in Level of Information Exposure
exposure_plot <-
ggplot(ozempic_survey_data_clean, aes(x = opinion_collapsed, fill = OZread)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Over the long run, how much do you think Ozempic and other\nsimilar drugs will do to reduce obesity in America?",
x = "More Pessimism -->",
y = "Response Percentage",
fill = "Exposure to media\nabout drugs like\nOzempic") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Viewing the plots in a grid.
grid.arrange(gender_plot, party_plot, income_plot, exposure_plot, genetic_plot, ncol = 2)
As we move to the right of each graph, it is assumed that the level of
pessimism in our participants increases. Some clear trends
start to emerge.
Contrary to my hypothesis, it seems woman are actually less pessimistic about new weight loss drugs and make up a smaller percentage of those who responded ‘Nothing at all’. This would suggest men are more pessimistic about the impact new medications like Ozempic will have on reducing obesity in America.
Next, visualizations were created to examine the same predictor variables relationships’ to our participants responses to the second question: “Do you think Ozempic, Wegovy and other similar drugs are good options for weight loss for individuals with obesity or a weight-related health issue?”.
# Visualizing gender differences
gender_OZUSE_plot <-
ggplot(ozempic_survey_data_clean, aes(x = OZUSE_a_W142, fill = gender)) +
geom_bar(position = "fill") +
labs(title = "Do you think Ozempic, Wegovy and other similar drugs are\ngood options for weight loss for individuals with\nobesity or a weight-related health issue?",
x = "More Skepticism -->",
y = "Response Percentage",
fill = "Gender") +
theme_minimal() +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer()+
scale_y_continuous(labels = scales::percent)
# Visualising differences in belief of genetic factor in weight gain
genetic_OZUSE_plot <-
ggplot(ozempic_survey_data_clean, aes(x = OZUSE_a_W142, fill = genetics_collapsed)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Do you think Ozempic, Wegovy and other similar drugs are\ngood options for weight loss for individuals with\nobesity or a weight-related health issue?",
x = "More Skepticism -->",
y = "Response Percentage",
fill = "How big of a role\ndoes genetics play\nin weight gain?") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing income differences
income_OZUSE_plot <-
ggplot(ozempic_survey_data_clean, aes(x = OZUSE_a_W142, fill = income_score)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Do you think Ozempic, Wegovy and other similar drugs are\ngood options for weight loss for individuals with\nobesity or a weight-related health issue?",
x = "More Skepticism -->",
y = "Response Percentage",
fill = "Income Group")+
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
axis.title.y = element_text(face = "bold"),
axis.text = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing Political Party Differences in Perceptions of Ozempic efficacy
party_OZUSE_plot <-
ggplot(ozempic_survey_data_clean, aes(x = OZUSE_a_W142, fill = partylean)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Do you think Ozempic, Wegovy and other similar drugs are\ngood options for weight loss for individuals with\nobesity or a weight-related health issue?",
x = "More Skepticism -->",
y = "Response Percentage",
fill = "Politcal Party") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Visualizing exposure to ozempic-related information
exposure_OZUSE_plot <-
ggplot(ozempic_survey_data_clean, aes(x = OZUSE_a_W142, fill = OZread)) +
geom_bar(position = "fill") +
theme_minimal() +
labs(title = "Do you think Ozempic, Wegovy and other similar drugs are\ngood options for weight loss for individuals with\nobesity or a weight-related health issue?",
x = "More Skepticism -->",
y = "Response Percentage",
fill = "Exposure to media\nabout drugs like\nOzempic") +
theme(legend.title = element_text(face = "bold"),
plot.title = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"),
axis.title.x = element_text(face = "italic"),
legend.text = element_text(face = "italic"),
axis.text.x = element_text(face = "bold")) +
scale_fill_brewer() +
scale_y_continuous(labels = scales::percent)
# Viewing the plots in a grid.
grid.arrange(gender_OZUSE_plot, party_OZUSE_plot, income_OZUSE_plot, exposure_OZUSE_plot, genetic_OZUSE_plot, ncol = 2)
As we move to the right of each graph, it is assumed that the level of
skepticism in our participants is increasing. Some clear trends
start to emerge here as well.
The most striking trend seems to be that those who have read or heard less about drugs like ozempic seem to be more skeptical of them. They make up the vast majority of those who answered ‘No’.
Those in the upper income group were more likely to respond, ‘Yes’ than those in the lower income group.
There seem’s to be no markable gender differences in responses to this question, other than females being very slightly less likely to respond, ‘No’, than males.
Two separate ordinal logistic regression models were initially used, however later tests showed that one of the assumptions of ordinal regression was not met. Because of this, I will simply provide my rational for using the model, a brief discussion of the assumptions of ordinal logistic regression, and the tests ran to evaluate the assumptions in the models.
The rational behind the use of ordinal logistic regression is due to having outcome variables that are categorical and ordinal. Ordinal logistic regression can also handle multiple predictor variables that are also categorical and ordinal.
The code to create the ordinal logistic regression models are provided below, however their outputs are not included (click show to view code).
# Null Model Creation
nullmodel1 <- polr(opinion_collapsed ~ 1, data = ozempic_survey_data_clean,
Hess = TRUE)
# Emperimental Model Creation
polrmodel1 <- polr(opinion_collapsed ~ gender + genetics_collapsed + OZread +
partylean + income_score, data = ozempic_survey_data_clean,
Hess = TRUE)
# An anova test was performed to compare the experimental model to the null model. It has been turned into a comment to prevent it's output.
## anova(nullmodel1, polrmodel1)
# Result outputs have been turned into comments to prevent it from showing.
## summary(polrmodel1)
## plot(allEffects(polrmodel1))
## AIC(polrmodel1)
## nagelkerke(polrmodel1)
# Creation of experimental model 2
ozuse_model <- polr(OZUSE_a_W142 ~ gender + genetics_collapsed + OZread + income_score +
partylean, data = ozempic_survey_data_clean, Hess = TRUE)
# Outputs for the model have been made into comments to prevent their output.
## summary(oz_usemodel)
## plot(allEffects(ozuse_model))
## AIC(ozuse_model)
## nagelkerke(ozuse_model)
These initial models using the proportional odds assumption confirmed much of was found in the earlier data visualization. However, because key predictors violated this assumption, these results are not reliable and are not interpreted further.
There are two important assumptions that are needed to use an ordinal logistic regressional model. One is that there is no multicolinearity. This occurs when two or more variables are highly correlated so that it is hard to differentiate between their impact on the model. This can lead to decreased model accuracy and coefficients that are difficult to interpret. The models passed this with flying colors
Secondly, the assumption of proportional odds. This means that if a characteristic (e.g. being a democrat), increases your odds of answering that Ozempic will help obesity in America, those odds should increase equally at each step up the ordinal scale (Not too much - Some, Some - A lot). This is important because it ensures the validity of our model. This is the assumption the initial models violated
Multicolinearity was tested for using the vif() function on both of the experimental models.
vif(polrmodel1)
## GVIF Df GVIF^(1/(2*Df))
## gender 1.040542 1 1.020070
## genetics_collapsed 1.025556 3 1.004215
## OZread 1.016183 1 1.008059
## partylean 1.011084 1 1.005527
## income_score 1.049892 2 1.012246
vif(ozuse_model)
## GVIF Df GVIF^(1/(2*Df))
## gender 1.048918 1 1.024167
## genetics_collapsed 1.027877 3 1.004593
## OZread 1.014737 1 1.007342
## income_score 1.048661 2 1.011949
## partylean 1.015541 1 1.007740
Since none of the values are above 10, that means there is no multicolinearity detected amongst variables in the experimental models.
A Brant test was used to test for the proportional odds assumption using the brant() function in R.
brant(polrmodel1)
## ----------------------------------------------------
## Test for X2 df probability
## ----------------------------------------------------
## Omnibus 61.78 16 0
## gender.L 1.93 2 0.38
## genetics_collapsed.L 0.03 2 0.99
## genetics_collapsed.Q 13.69 2 0
## genetics_collapsed.C 1.55 2 0.46
## OZread.L 32.53 2 0
## partylean.L 0.19 2 0.91
## income_score.L 3.84 2 0.15
## income_score.Q 1.88 2 0.39
## ----------------------------------------------------
##
## H0: Parallel Regression Assumption holds
## Warning in brant(polrmodel1): 72 combinations in table(dv,ivs) do not occur.
## Because of that, the test results might be invalid.
brant(ozuse_model)
## ----------------------------------------------------
## Test for X2 df probability
## ----------------------------------------------------
## Omnibus 40.61 8 0
## gender.L 0.06 1 0.8
## genetics_collapsed.L 7.79 1 0.01
## genetics_collapsed.Q 4.04 1 0.04
## genetics_collapsed.C 0.77 1 0.38
## OZread.L 6.75 1 0.01
## income_score.L 3.82 1 0.05
## income_score.Q 0.98 1 0.32
## partylean.L 9.45 1 0
## ----------------------------------------------------
##
## H0: Parallel Regression Assumption holds
## Warning in brant(ozuse_model): 33 combinations in table(dv,ivs) do not occur.
## Because of that, the test results might be invalid.
The proportional odds assumption was violated in both of our models. In our first model, genetics_collapsed.Q, and OZread.L both violate the assumption as indicated by a probability value of 0. In the second model, genetics_collapsed.L, OZread.L, and partylean.L also did not meet the proportional odds assumption.
This is not entirely uncommon when making ordinal logistic regression models using categorical survey data.
To deal with this violation, two separate partial proportional odds model, which relax the proportional odds assumption for the variables that fail to meet it, were favored.
A partial proportional odds regression model was opted for because it relaxes the proportional odds assumption for the variables which violated it in our initial models. This allows for a more flexible model that can be trusted.
Two separate partial proportional odds logistic regression models were computed using the vglm() function in R. All statistical analysis was run in RStudio Version 2024.12.1+563 (2024.12.1+563).
The dependent variable for the first model was participants’ pessimism towards weight loss medications based on responses to question 1 (opinion_collapsed):
“Over the long run, how much do you think Ozempic and other similar drugs will do to reduce obesity in America?” (1 - A lot, 2 - Some, 3 - Not too much, 4 - Nothing at all)
The dependent variable for the second model was participants’ skepticism towards weight loss medications based on responses to question 2 (OZUSE_a_W142):
“Do you think Ozempic, Wegovy and other similar drugs are good options for weight loss for individuals with obesity or a weight-related health issue?” (1 - Yes, 2 - Not sure, 3 - No)
The predictor variables for both models were gender (gender), causal attribution of genetics to obesity (genetics_collapsed), political party affiliation (partylean), level of exposure to weight loss drug-related information (OZread), and income level (income_score).
This model examines the relationship between the 5 predictor variables and the level of pessimism in participant’s responses.
# Creating a null model for comparision
null_model <- vglm(opinion_collapsed ~ 1, family = cumulative(parallel = FALSE,
reverse = TRUE),
data = ozempic_survey_data_clean)
# Model 1 Partial Proportional Model For Outcome Variable 1.
ppo_model <- vglm(
opinion_collapsed ~ gender + genetics_collapsed + OZread + partylean + income_score,
family = cumulative(parallel = FALSE ~ OZread + genetics_collapsed, reverse = TRUE),
data = ozempic_survey_data_clean
)
summary(ppo_model)
##
## Call:
## vglm(formula = opinion_collapsed ~ gender + genetics_collapsed +
## OZread + partylean + income_score, family = cumulative(parallel = FALSE ~
## OZread + genetics_collapsed, reverse = TRUE), data = ozempic_survey_data_clean)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept):1 1.54743 0.08732 17.722 < 2e-16 ***
## (Intercept):2 -0.31260 0.06425 -4.865 1.14e-06 ***
## (Intercept):3 -2.62154 0.10386 -25.242 < 2e-16 ***
## gender.L -0.16706 0.05824 -2.868 0.004125 **
## genetics_collapsed.L:1 -0.74055 0.21058 -3.517 0.000437 ***
## genetics_collapsed.L:2 -0.78050 0.15138 -5.156 2.52e-07 ***
## genetics_collapsed.L:3 -0.79086 0.22931 -3.449 0.000563 ***
## genetics_collapsed.Q:1 -0.27268 0.17101 -1.595 0.110820
## genetics_collapsed.Q:2 0.17932 0.12296 1.458 0.144742
## genetics_collapsed.Q:3 0.70188 0.20294 3.458 0.000543 ***
## genetics_collapsed.C:1 0.18441 0.11896 1.550 0.121095
## genetics_collapsed.C:2 0.07208 0.08529 0.845 0.398065
## genetics_collapsed.C:3 0.03450 0.17168 0.201 0.840739
## OZread.L:1 -0.66648 0.08200 -8.127 4.38e-16 ***
## OZread.L:2 -0.29007 0.06594 -4.399 1.09e-05 ***
## OZread.L:3 0.07675 0.13410 0.572 0.567121
## partylean.L -0.24455 0.05749 -4.254 2.10e-05 ***
## income_score.L -0.13313 0.08516 -1.563 0.117980
## income_score.Q -0.12659 0.06638 -1.907 0.056517 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Names of linear predictors: logitlink(P[Y>=2]), logitlink(P[Y>=3]),
## logitlink(P[Y>=4])
##
## Residual deviance: 4998.129 on 6446 degrees of freedom
##
## Log-likelihood: -2499.065 on 6446 degrees of freedom
##
## Number of Fisher scoring iterations: 5
##
## Warning: Hauck-Donner effect detected in the following estimate(s):
## '(Intercept):3'
##
##
## Exponentiated coefficients:
## gender.L genetics_collapsed.L:1 genetics_collapsed.L:2
## 0.8461461 0.4768506 0.4581756
## genetics_collapsed.L:3 genetics_collapsed.Q:1 genetics_collapsed.Q:2
## 0.4534563 0.7613337 1.1964050
## genetics_collapsed.Q:3 genetics_collapsed.C:1 genetics_collapsed.C:2
## 2.0175333 1.2025088 1.0747363
## genetics_collapsed.C:3 OZread.L:1 OZread.L:2
## 1.0351012 0.5135121 0.7482103
## OZread.L:3 partylean.L income_score.L
## 1.0797673 0.7830595 0.8753507
## income_score.Q
## 0.8810992
Psuedo R-squared values were calculated using nagelkerke() function in R.
#Calculated psuedo R-squared using nagelkerke() function.
nagelkerke(ppo_model)
## $Models
##
## Model: "vglm, opinion_collapsed ~ gender + genetics_collapsed + OZread + partylean + income_score, cumulative(parallel = FALSE ~ OZread + genetics_collapsed, reverse = TRUE), ozempic_survey_data_clean"
## Null: "vglm, opinion_collapsed ~ 1, cumulative(parallel = FALSE ~ OZread + genetics_collapsed, reverse = TRUE), ozempic_survey_data_clean"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.0395715
## Cox and Snell (ML) 0.0911364
## Nagelkerke (Cragg and Uhler) 0.1000810
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## 16 -102.97 205.93 5.0009e-35
##
## $Number.of.observations
##
## Model: 2155
## Null: 2155
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
Akaike Information Criterion (AIC) calcluated for both the null model.
AIC(null_model)
## [1] 5210.061
AIC was calculated for experimental model.
AIC(ppo_model)
## [1] 5036.129
# Creating probability plots for each predictor variable for our first outcome variable. How likely are participants to respond with more pessimism to the question: Over the long run, how much do you think drugs like Ozempic will do to help obesity in America?
GENDERpred <- predict_response(ppo_model, terms = c("gender"))
gender_pred_plot <- plot(GENDERpred, facets = TRUE, connect_lines = TRUE, one_plot = TRUE, color = 'darkorange')
genetics_collapsedpred <- predict_response(ppo_model, terms = c("genetics_collapsed"))
genetics_collapsed_pred_plot <- plot(genetics_collapsedpred, facets = TRUE, connect_lines = TRUE, one_plot = TRUE, color = 'darkorange')
OZreadpred <- predict_response(ppo_model, terms = c("OZread"))
OZread_pred_plot <- plot(OZreadpred, facets = TRUE, connect_lines = TRUE, one_plot = TRUE, color = 'darkorange')
partyleanpred <- predict_response(ppo_model, terms = c("partylean"))
partylean_pred_plot <- plot(partyleanpred, facets = TRUE, connect_lines = TRUE, one_plot = TRUE, color = 'darkorange')
income_scorepred <- predict_response(ppo_model, terms = c("income_score"))
income_score_pred_plot <- plot(income_scorepred, facets = TRUE, connect_lines = TRUE, one_plot = TRUE, color = 'darkorange')
# Combining probability plots for all predictor variables
grid.arrange(gender_pred_plot, genetics_collapsed_pred_plot, OZread_pred_plot, partylean_pred_plot, income_score_pred_plot, ncol = 2)
For the Partial Proportional Odds Model 1, the dependent variable was
participants’ level of pessimism towards the impact weight loss drugs
like Ozempic on reducing obesity in America. Since logistic regression
does not yield a traditional R-squared value, two pseudo R-squared
measures were used to evaluate model fit. Results showed that the
predictors accounted for 3.9% to 10% of the variance in pessimism, based
on McFadden’s pseudo R² = 0.0395 and Nagelkerke’s pseudo R² = 0.10. The
overall model was statistically significant (p < .001, likelihood
ratio test: p = 5.00e−35). Model fit was further supported by a
reduction in the Akaike Information Criterion (AIC): the experimental
model had a lower AIC (5036) than the null model (5210), indicating that
the inclusion of predictors improved the model’s performance.
The results of the partial proportional odds model indicated that being female was significantly associated with lower odds of pessimism toward weight-loss medications like Ozempic (b = –0.17, p = 0.004; OR ≈ 0.85). Similarly, greater belief in genetic causes of obesity was linked to reduced pessimism (b = –0.79, p < 0.001; OR ≈ 0.45).
Increased exposure to information about these medications was also associated with lower levels of pessimism (b = –0.66, p < 0.001; OR ≈ 0.52). However, at the highest threshold of the outcome (i.e., participants who responded ‘Nothing at all’, expressing the greatest pessimism), the association between exposure and pessimism was non-significant and slightly reversed (b = 0.07, p = 0.56), suggesting that the relationship may vary across levels of pessimism.
Identifying as a Democrat (compared to Republican) was associated with lower odds of pessimism (b = –0.24, p < 0.001; OR ≈ 0.79). Higher income was not significantly related to pessimism (b = –0.12, p = 0.056), though the effect was approaching significance.
Results can be interpreted visually from the probability effect plots above.
This model examines the relationship between the 5 predictor variables and the level of skepticism in participant’s responses.
# Null Model Created for Model 2
null_model2 <- vglm(
OZUSE_a_W142 ~ 1,
family = cumulative(parallel = FALSE, reverse = TRUE),
data = ozempic_survey_data_clean,
)
# Model 2 Partial Proportional Model For Outcome Variable 2.
ozuse_ppomodel <- vglm(
OZUSE_a_W142 ~ gender + genetics_collapsed + OZread + partylean + income_score,
family = cumulative(parallel = FALSE ~ OZread + genetics_collapsed + partylean, reverse = TRUE),
data = ozempic_survey_data_clean,
)
summary(ozuse_ppomodel)
##
## Call:
## vglm(formula = OZUSE_a_W142 ~ gender + genetics_collapsed + OZread +
## partylean + income_score, family = cumulative(parallel = FALSE ~
## OZread + genetics_collapsed + partylean, reverse = TRUE),
## data = ozempic_survey_data_clean)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept):1 -0.40216 0.06551 -6.139 8.33e-10 ***
## (Intercept):2 -1.53717 0.08178 -18.797 < 2e-16 ***
## gender.L -0.10527 0.06368 -1.653 0.098326 .
## genetics_collapsed.L:1 -0.57162 0.15193 -3.763 0.000168 ***
## genetics_collapsed.L:2 -0.09686 0.18317 -0.529 0.596966
## genetics_collapsed.Q:1 0.21500 0.12382 1.736 0.082504 .
## genetics_collapsed.Q:2 -0.09773 0.14832 -0.659 0.509955
## genetics_collapsed.C:1 0.12641 0.08684 1.456 0.145474
## genetics_collapsed.C:2 0.05066 0.10250 0.494 0.621151
## OZread.L:1 -0.53072 0.06830 -7.770 7.83e-15 ***
## OZread.L:2 -0.69121 0.08843 -7.816 5.45e-15 ***
## partylean.L:1 -0.32713 0.06495 -5.036 4.74e-07 ***
## partylean.L:2 -0.14899 0.07661 -1.945 0.051783 .
## income_score.L -0.55092 0.09368 -5.881 4.08e-09 ***
## income_score.Q -0.08675 0.07206 -1.204 0.228674
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Names of linear predictors: logitlink(P[Y>=2]), logitlink(P[Y>=3])
##
## Residual deviance: 3873.261 on 4295 degrees of freedom
##
## Log-likelihood: -1936.63 on 4295 degrees of freedom
##
## Number of Fisher scoring iterations: 5
##
## No Hauck-Donner effect found in any of the estimates
##
##
## Exponentiated coefficients:
## gender.L genetics_collapsed.L:1 genetics_collapsed.L:2
## 0.9000830 0.5646074 0.9076869
## genetics_collapsed.Q:1 genetics_collapsed.Q:2 genetics_collapsed.C:1
## 1.2398641 0.9068957 1.1347522
## genetics_collapsed.C:2 OZread.L:1 OZread.L:2
## 1.0519609 0.5881824 0.5009679
## partylean.L:1 partylean.L:2 income_score.L
## 0.7209928 0.8615740 0.5764169
## income_score.Q
## 0.9169098
Pseudo R-squared calculated using nagelkerke() function in R.
#Psuedo R-Squared
nagelkerke(ozuse_ppomodel)
## $Models
##
## Model: "vglm, OZUSE_a_W142 ~ gender + genetics_collapsed + OZread + partylean + income_score, cumulative(parallel = FALSE ~ OZread + genetics_collapsed + partylean, reverse = TRUE), ozempic_survey_data_clean"
## Null: "vglm, OZUSE_a_W142 ~ 1, cumulative(parallel = FALSE ~ OZread + genetics_collapsed + partylean, reverse = TRUE), ozempic_survey_data_clean"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.0490732
## Cox and Snell (ML) 0.0885812
## Nagelkerke (Cragg and Uhler) 0.1043430
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## 13 -99.941 199.88 1.4449e-35
##
## $Number.of.observations
##
## Model: 2155
## Null: 2155
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
AIC calculated for null model.
AIC(null_model2)
## [1] 4077.143
AIC calculated for experimental model.
AIC(ozuse_ppomodel)
## [1] 3903.261
# Creating probability plots for all predictor variables for outcome variable 2. How likely are participants to respond with more skepticism to the quesstion: Do you think drugs like Ozempic are a good treatment option for people with obesity or other weight related health issues?
genderpred2 <- predict_response(ozuse_ppomodel, terms = c("gender"))
genderpredplot2 <- plot(genderpred2, connect_lines = TRUE, color = "darkorange")
genetics_collapsedpred2 <- predict_response(ozuse_ppomodel, terms = c("genetics_collapsed"))
genetics_collapsed_pred_plot2 <- plot(genetics_collapsedpred2, connect_lines = TRUE, color = "darkorange")
OZreadpred2 <- predict_response(ozuse_ppomodel, terms = c("OZread"))
OZread_pred_plot2 <- plot(OZreadpred2, connect_lines = TRUE, color = "darkorange")
partyleanpred2 <- predict_response(ozuse_ppomodel, terms = c("partylean"))
partylean_pred_plot2 <- plot(partyleanpred2, connect_lines = TRUE, color = "darkorange")
income_scorepred2 <- predict_response(ozuse_ppomodel, terms = c("income_score"))
income_score_pred_plot2 <- plot(income_scorepred2, connect_lines = TRUE, color = 'darkorange')
# Combining probability plots of all 5 predictor variables
grid.arrange(genderpredplot2, genetics_collapsed_pred_plot2, OZread_pred_plot2, partylean_pred_plot2, income_score_pred_plot2, ncol = 2)
For the Partial Proportional Odds Model 2, the dependent variable was
participants’ level of skepticism towards new weight loss drugs like
Ozempic (OZUSE_a_W142), as indicated by the degree to which they believe
the drugs are a good option for those struggling with obesity or other
weight-related health issues. Again, multiple measures of psuedo
R-squared were utilized to evaluate model fit. Results showed that the
predictors accounted for 5% to 10% of the variation in responses, based
on McFadden’s pseudo R² = 0.049 and Nagelkerke’s pseudo R² = 0.10. The
overall model was statistically significant (p < .001, likelihood
ratio test: p = 1.4449e-35). Model fit was further supported by a
reduction in the AIC: the experimental model had a lower AIC (3903) than
the null model (4077), indicating that the inclusion of predictors
improved the model’s performance.
In Model 2, gender was not significantly associated with skepticism towards weight loss medications (b = -0.10, p = 0.09, OR = 0.90), although this effect may be approaching significance. Belief in genetic causes of obesity showed a non-parallel effect across outcome thresholds. Specifically, greater attribution of obesity to genetics was associated with lower odds of responding “Not sure” about Ozempic being a good option for those struggling with obesity (b = –0.57, p < 0.001, OR = 0.56), but showed no significant effect at the most skeptical response level (b = –0.09, p = 0.60, OR = 0.91).
Greater exposure to information about weight-loss medications was associated with lower skepticism, as indicated by a significant negative coefficient (b = –0.69, p < 0.001, OR = 0.50). Similarly, identifying as a Democrat (vs. Republican) was associated with lower odds of expressing skepticism (b = –0.32, p < 0.001, OR = 0.72). Finally, lower income was significantly related to higher skepticism toward Ozempic (b = –0.55, p < 0.001, OR = 0.58).
Results can be interpeted visually through the probability effects plots above.
This project examined public perceptions of new weight loss drugs like Ozempic and their potential to address obesity and identified key demographic and attitudinal predictors of skepticism/support and pessimism/optimism using partial proportional odds logistic regression.
The results of the analysis showed that, overall, the strongest predictors of negative attitudes towards GLP-1 receptor antagonists like Ozempic were less believe in a genetic factor in weight gain and less exposure to information regarding the weight loss drugs.
Results suggest that individuals who believe less in genetic causes of obesity, have lower exposure to information about Ozempic, lean politically conservative, or report lower income are more likely to view the drug with skepticism. Conversely, belief in genetic explanations and greater familiarity with Ozempic are associated with more optimistic views. These findings highlight the importance of addressing informational gaps and public beliefs in clinical and public health communication. As medications like Ozempic become more prominent in obesity treatment, understanding these attitudes can help guide equitable access, reduce stigma, and support more personalized conversations between patients and healthcare providers.
While the majority of participants expressed support for Ozempic, the presence of meaningful variation in levels of skepticism and pessimism allowed for some key predictors to emerge. Understanding the factors that shape skepticism and pessimism towards weight loss medications remains essential for designing inclusive public health messaging and addressing potential barriers to treatment acceptance.
This project is based on secondary survey data, which limits the control over how variables were measured and may affect how precisely they capture the constructs of interest. Additionally, the cross-sectional design prevents any conclusions about causality. Some predictor variables were reverse-coded, which may introduce interpretive complexity. In future research, I would conduct my own survey to test whether these results hold true in different populations and by using slightly different question wording to probe the same core beliefs and attitudes. This would help validate the findings and improve the reliability of the measures used.
My understanding of the mathematics and mechanics behind ordinal logistic regression may have limited my interpretation of the results, which may have led to mistakes. Feel free to email me at archit.nangavaram01@utrgv.edu if you find any errors in my statistical analysis.
Lastly, there are many skills I am hoping to acquire as I am learning R. One such skill that would have been invaluable in this project is the creation of custom functions for repetitive tasks. Tasks like changing factor levels, and creating graphs would have been much simpler and less prone to mistakes.