我正在研究一个包含19个子群的大型数据集,我想运行一个线性空间回归模型来估算BMI。
我使用的协变量之一是性,但是一些子群只由男性组成,这会导致我的循环出现问题。 如果我尝试运行线性回归模型,我会收到以下错误:
tmp *`,value = contr.funs [1 + isOF [nn]]): 对比只能适用于具有2级或更多级别的因素
我已经找到了解决这个问题的方法,通过以下(简化)代码为男性和女性的男性和次级组件分组运行单独的循环:
men <- c(1,6,15) # Cohort nrs that only contain men
menandwomen <- c(2,3,4,5,7,8,9,10,11,12,13,14,16,17,18,19)
trenddpmodelm <-list()
for(i in men) {
trenddpmodelm[[i]] <- lm(BMI ~ age + sex,
data=subcohort[subcohort$centre_a==i, ],)
}
trenddpmodelmw <-list()
for(i in menandwomen) {
trenddpmodelmw[[i]] <- lm(BMI ~ age + sex,
data=subcohort[subcohort$centre_a==i, ],)
}
trenddpmodel <- c(list(trenddpmodelm[[1]]), list(trenddpmodelmw[[2]]), list(trenddpmodelmw[[3]]), list(trenddpmodelmw[[4]]), list(trenddpmodelmw[[5]]), list(trenddpmodelm[[6]]), list(trenddpmodelmw[[7]]), list(trenddpmodelmw[[8]]), list(trenddpmodelmw[[9]]), list(trenddpmodelmw[[10]]), list(trenddpmodelmw[[11]]), list(trenddpmodelmw[[12]]), list(trenddpmodelmw[[13]]), list(trenddpmodelmw[[14]]), list(trenddpmodelm[[15]]), list(trenddpmodelmw[[16]]), list(trenddpmodelmw[[17]]), list(trenddpmodelmw[[18]]), list(trenddpmodelmw[[19]]))
在此步骤之后,我从摘要中提取相关信息并将其放入df中以导出到excel。 我的问题是我将运行大量的分析,这将导致页面和代码页。
我的问题是: R中是否有我可以使用的设置,允许在适用的子群组中从我的线性回归模型中删除非变化因子?(类似于发生的情况)在coxph; R给出一个警告,该因子并不总是变化,但循环确实运行)
如果没有解决方案,我不能继续工作,但我一直试图在没有成功的情况下找到这个问题的答案,我认为必须以某种方式。任何建议都非常感谢:)
答案 0 :(得分:0)
我建议在循环中动态构建公式。
DF <- list(Cohort1 = data.frame(bmi = rnorm(25, 24, 1),
age = rnorm(25, 50, 3),
sex = sample(c("F", "M"), 25, replace = TRUE)),
Cohort2 = data.frame(bmi = rnorm(15, 24, 1),
age = rnorm(15, 55, 4),
sex = rep("M", 15)))
candidate_vars <- c("age", "sex")
Models <- vector("list", length(DF))
for (i in seq_along(DF)){
# Determine if the variables are either numeric, or factor with more than 1 level
indep <- vapply(X = DF[[i]][candidate_vars],
FUN = function(x){
if (is.numeric(x)) return(TRUE)
else return(nlevels(x) > 1)
},
FUN.VALUE = logical(1))
# Write the formula
form <- paste("bmi ~ ", paste(candidate_vars[indep], collapse = " + "))
# Create the model
Models[[i]] <- lm(as.formula(form), data = DF[[i]])
}