【问题标题】:Univariate logistic regression in RR中的单变量逻辑回归
【发布时间】:2026-01-21 18:50:01
【问题描述】:

我正在尝试进行单变量逻辑回归分析。输入是一个数据框,其中包含 1 个响应变量、一些人口统计数据(年龄、性别和种族)和 >100 个预测变量。为了分析它,我一直在使用:

#Function
proc_glm <- function(predictors) {
    univariate <- glm(Data$Outcome ~ predictors, family = binomial)
    
    return(cbind(coef(summary(univariate)),OR = exp(coef(univariate)), exp(confint(univariate))))
  }

#Call Function
glm_output <- lapply(Data[5:150], proc_glm)

这在整个数据库上工作得很好。然后,我根据种族对数据进行了子集化,我使用的是:

Data1 <- subset(Data,Ethnicity==0)

没有明显问题; “数据 1”的行数比“数据”少,但变量数相同。没有缺失数据。

然后我尝试运行与以前相同的分析,在两个地方都将 Data1 替换为 Data,但我收到以下错误:

cbind(coef(summary(univariate)), OR = exp(coef(univariate)) 中的错误: 矩阵的行数必须匹配(参见参数 3)

我不确定我所做的更改会导致错误。 我正在开发 R Studio - 版本 1.2.1335

数据如下所示:

Data <-cbind(
  data.frame(
    Age=sample(20:80,50),
    Gender=sample(0:1,size=50,replace=TRUE),
    Ethnicity=sample(0:2,size=50,replace=TRUE),
    Outcome=sample(0:1,size=50,replace=TRUE)
  ),
  data.frame(replicate(100,sample(0:2,50,rep=TRUE)))
)

【问题讨论】:

  • 你是重新运行整个thiniig还是只运行这一行glm_output &lt;- lapply(Data1[5:150], proc_glm)
  • 我重新运行了所有内容。
  • 如果你创建另一个名为proc_glm1 的函数然后尝试,你仍然得到错误吗?
  • 您能否向我们展示您的一些数据或创建一个测试数据框以供我们试用您的代码?将有助于了解正在发生的事情。
  • 同样的错误 - 忽略我之前的回复。我错过了一项更改,因此它试图调用原始公式。

标签: r glm


【解决方案1】:

问题在于您在函数中使用了参数预测器和全局变量 Data(因此它总是使用 Outcome 的每一行)。您需要将结果列作为参数传递,以便它与预测变量匹配相同的行数。

Data <-cbind(
  data.frame(
    Age=sample(20:80,50),
    Gender=sample(0:1,size=50,replace=TRUE),
    Ethnicity=sample(0:2,size=50,replace=TRUE),
    Outcome=sample(0:1,size=50,replace=TRUE)
  ),
  data.frame(replicate(100,sample(0:2,50,rep=TRUE)))
)

proc_glm <- function(predictors, outcome) {
  univariate <- glm(outcome ~ predictors, family = binomial)
  
  return(cbind(coef(summary(univariate)),OR = exp(coef(univariate)), exp(confint(univariate))))
}

glm_output <- lapply(Data[5:100], proc_glm, outcome=Data$Outcome)

Data1 <- subset(Data,Ethnicity==0)
glm_output <- lapply(Data1[5:100], proc_glm, outcome=Data1$Outcome)

【讨论】:

  • 感谢您的回答。这个脚本我实际上得到了同样的错误。我认为这个问题与一些变量的分析条目不足有关。我一直在 cbind 周围使用 trycatch 步骤来捕获错误。