在一些子集(但不是全部)的for循环中使用lm()时,说服R排除单级因子

时间:2016-10-05 09:50:19

标签: r linear-regression

我正在研究一个包含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给出一个警告,该因子并不总是变化,但循环确实运行)

如果没有解决方案,我不能继续工作,但我一直试图在没有成功的情况下找到这个问题的答案,我认为必须以某种方式。任何建议都非常感谢:)

1 个答案:

答案 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]])
}