【问题标题】:loop for writing a multivariate binary logistic regression analysis用于编写多元二元逻辑回归分析的循环
【发布时间】:2018-03-26 18:34:28
【问题描述】:
df <- data.frame(
disease = c(0,1,0,1),
var1 = c(0,1,2,0),
var2 =c(0,1,2,0),
var3 = c(0,1,2,0),
var40 = c(0,1,2,0),
Bi = c(0,1,0,1),
gender = c(1,0,1,0),
P1 = c(-0.040304832,0.006868288,0.002663759,0.020251087),
P2 = c(0.010566526,0.002663759,0.017480721,-0.008685749),
P3 = c(-0.008685749,0.020251087,-0.040304832,0.002663759),
P4 = c(0.017480721,0.024306667,0.002663759,0.010566526),
stringsAsFactors = FALSE)

上述数据框(df)由分类变量和数值变量组成;疾病、Bi 和性别标签为 0,1,而 var1 到 var40 由标签 0,1,2 组成,而 PC1,PC2,PC3,PC4 由连续数值变量组成。一个变量的 glm 模型的代码将是:

glm(disease ~ var1*Bi+ gender+P1+P2+P3+P4, family = binomial(link
= 'logit'), data = df)

我需要一些帮助来编写一个循环,该循环自动执行疾病与variant1(var1)到Variant40(var)的多元回归分析,即具有相同的协变量; Bi,性别,P1,P2,P3,P4。我正在为所有 40 个变体做类似下面提到的循环,但它不起作用:

for (i in df$var1:df$var40) {glm(DepVar1 ~ i*Bi+gender+P1+P2+P3+P4, data=df, 
family=binomial("logit")) }

【问题讨论】:

    标签: r logistic-regression


    【解决方案1】:

    动态购买公式可能有点棘手,但 update()reformulate() 这样的函数可以提供帮助。例如

    results <- Map(function(i) {
      newform <- update(disease ~ Bi+gender+P1+P2+P3+P4, reformulate(c(".", i)))
      glm(newform, data=df, family=binomial("logit")) 
    }, names(subset(df, select=var1:var40)))
    

    这里我们使用Map 而不是 for 循环,因此保存结果更容易(使用此方法将它们放入列表中)。但是我们使用update() 将感兴趣的新变量添加到基本公式中。比如

    update(disease ~ Bi+gender+P1+P2+P3+P4, ~ . + var1)
    # disease ~ Bi + gender + P1 + P2 + P3 + P4 + var1
    

    这会在右侧添加一个变量。我们使用reformulate()将列名作为字符串转化为公式。

    你可以从列表中取出所有模型

    results$var1
    results$var40
    # etc
    

    【讨论】:

    • @MrFlick...成功了,非常感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2013-12-20
    • 2020-08-01
    • 2014-06-26
    • 2017-07-30
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多