Skip to content

Commit 57e00b1

Browse files
authored
Merge pull request #12 from remlapmot/fsw-error
Fix bug when either a covariate or an exposure was class factor
2 parents 712ba13 + d8e9ea2 commit 57e00b1

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package: OneSampleMR
22
Title: One Sample Mendelian Randomization and Instrumental Variable
33
Analyses
4-
Version: 0.1.5.9000
4+
Version: 0.1.6
55
Authors@R: c(
66
person("Tom", "Palmer", , "remlapmot@hotmail.com", role = c("aut", "cre"),
77
comment = c(ORCID = "0000-0003-4655-4511")),

NEWS.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# OneSampleMR 0.1.5.9000
1+
# OneSampleMR 0.1.6
2+
3+
* Fixed a bug in `fsw()` when an exogenous covariate was a factor (thanks @ZoeReed)
4+
5+
* The `fsw()` function now returns an error if any of the exposures are factors
26

37
# OneSampleMR 0.1.5
48

R/fsw.R

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ fsw.ivreg <- function(object) {
5050

5151
ninstruments <- length(object$instruments)
5252
nexogenous <- length(object$exogenous) - 1
53-
namesendog <- names(object$endogenous)
54-
namesexog <- names(object$exogenous[-1])
53+
namesendog <- labels(object$terms$regressors)[1:nendog]
54+
endogfcterrmsg <- paste("One or more of your exposure variables is a factor.",
55+
"Please convert to numeric with say as.numeric(),",
56+
"refit your ivreg() model, and rerun fsw().")
57+
if ("factor" %in% lapply(object$model[namesendog], class)) stop(endogfcterrmsg)
58+
59+
namesexog <- labels(object$terms$regressors)[-(1:nendog)]
5560
namesinstruments <- names(object$instruments)
5661
n <- object$n
5762
fsw <- fswdf <- fswresdf <- fswp <- numeric(nendog)

tests/testthat/test-fsw.R

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,3 +974,65 @@ test_that("Compare with Stata ivreg2 output", {
974974
#
975975
# . di Fsw21
976976
# 81.812373
977+
978+
set.seed(20250519)
979+
980+
# Define the number of observations you want to generate
981+
n <- 300000
982+
983+
# Define the data structure
984+
# Binary alc_deaths variable
985+
alc_deaths <- rbinom(n, 1, p = 0.01)
986+
# Binary sex variable
987+
sex <- rbinom(n, 1, p = 0.5)
988+
# Binary belief variable
989+
bileve <- rbinom(n, 1, p = 0.1)
990+
# Normal distribution for log_dpw
991+
log_dpw <- rnorm(n, 2, 1)
992+
# Normal distribution for education years
993+
eduyears <- rnorm(n, 14, 5)
994+
# Normal distribution for intervention
995+
inter <- rnorm(n, 30, 18)
996+
# Normal distribution for age
997+
age <- rnorm(n, 57, 8)
998+
# Normal distribution for dpw_main_grs
999+
dpw_main_grs <- rnorm(n, 0, 1)
1000+
# Normal distribution for edu_main_grs
1001+
edu_main_grs <- rnorm(n, 0, 1)
1002+
# Normal distribution for inter_grs
1003+
inter_grs <- rnorm(n, 0.2, 1)
1004+
1005+
# Create data.frame
1006+
simulated_data <- data.frame(alc_deaths, sex, bileve, log_dpw, eduyears, inter, age, dpw_main_grs, edu_main_grs, inter_grs)
1007+
1008+
test_that("Example from Zoe Reed with factor variables in covariate list", {
1009+
# Run with no error
1010+
tsls_sim <- ivreg::ivreg(alc_deaths ~ log_dpw + eduyears + inter + age + sex + bileve | dpw_main_grs + edu_main_grs + inter_grs + age + sex + bileve, data = simulated_data)
1011+
1012+
expect_no_error({fswres1 <- fsw(tsls_sim)})
1013+
1014+
# Including factor variable causes error
1015+
simulated_data$sex <- as.factor(simulated_data$sex)
1016+
1017+
tsls_sim2 <- ivreg::ivreg(alc_deaths ~ log_dpw + eduyears + inter + age + sex + bileve | dpw_main_grs + edu_main_grs + inter_grs + age + sex + bileve, data = simulated_data)
1018+
1019+
expect_no_error({fswres2 <- fsw(tsls_sim2)})
1020+
1021+
expect_equal(fswres1, fswres2)
1022+
})
1023+
1024+
# Expect failure if a binary exposure is a factor
1025+
simulated_data$expfct <- as.factor(rbinom(n, 1, p = 0.4))
1026+
1027+
test_that("Test fsw() when exposure is class factor", {
1028+
tsls_sim3 <- ivreg::ivreg(alc_deaths ~ log_dpw + eduyears + expfct + age + sex + bileve | dpw_main_grs + edu_main_grs + inter_grs + age + sex + bileve, data = simulated_data)
1029+
expect_error({fsw(tsls_sim3)})
1030+
})
1031+
1032+
# Expect no error if a binary exposure is numeric
1033+
simulated_data$expfct <- as.numeric(simulated_data$expfct)
1034+
1035+
test_that("Test fsw() when exposure is binary but numeric", {
1036+
tsls_sim4 <- ivreg::ivreg(alc_deaths ~ log_dpw + eduyears + expfct + age + sex + bileve | dpw_main_grs + edu_main_grs + inter_grs + age + sex + bileve, data = simulated_data)
1037+
expect_no_error({fswres4 <- fsw(tsls_sim4)})
1038+
})

0 commit comments

Comments
 (0)