R 中 glm 函数中 X 值(因变量)的动态数量没有给出正确的输出

Dynamic number of X values (dependent variables) in glm function in R isn't giving the right output

用于逻辑回归的 R-glm。我试图根据另一个堆栈溢出 post 向公式动态输入值。 该函数是使用 rpy2 从 python 调用的。当我打印出 summery(glm.out).
我 运行 针对 2 种不同场景的测试。

输入的数字正确。但格式不同。第一个场景 - 数据框和第二个 - 向量。 或者我的glm调用错误。

R代码。

logistic_regression = function(y,x,colnames){
    print("Y value is ")
    print(y)
    print("X value is ")
    print(x)
    m <- c(1,1,1,0,0,0)
    k1 <- c(4,3,5,1,2,3)
    k2 <- c(6,7,8,5,6,3)

    glm.out = glm(as.formula(paste("y~", paste(colnames, collapse="+"))), family=binomial(logit), data=x)
    # glm.out = glm(m~k1+k2, family=binomial(logit), data=x)    
    return(summary(glm.out))
}

输入打印

[1] "Y value is "
[1] 1 1 1 0 0 0
[1] "X value is "
  X0 X1
0  4  6
1  3  7
2  5  8
3  1  5
4  2  6
5  3  3

当我运行代码

glm.out = glm(as.formula(paste("y~", paste(colnames, collapse="+"))), family=binomial(logit), data=x)

输出

Call:
glm(formula = as.formula(paste("y~", paste(colnames, collapse = "+"))), 
    family = binomial(logit), data = x)

Deviance Residuals: 
[1]  0  0  0  0  0  0

Coefficients: (3 not defined because of singularities)
              Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.457e+01  1.310e+05       0        1
X02          6.872e-14  1.853e+05       0        1
X03          3.566e-14  1.853e+05       0        1
X04          4.913e+01  1.853e+05       0        1
X05          4.913e+01  1.853e+05       0        1
X15                 NA         NA      NA       NA
X16                 NA         NA      NA       NA
X17          4.913e+01  1.853e+05       0        1
X18                 NA         NA      NA       NA

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 8.3178e+00  on 5  degrees of freedom
Residual deviance: 2.5720e-10  on 0  degrees of freedom
AIC: 12

Number of Fisher Scoring iterations: 23

但是当我 运行

glm.out = glm(m~k1+k2, family=binomial(logit), data=x)

输出完全不同(看起来更正确)

Call:
glm(formula = m ~ k1 + k2, family = binomial(logit), data = x)

Deviance Residuals: 
         0           1           2           3           4           5  
 1.532e-06   1.390e-05   2.110e-08  -2.110e-08  -1.344e-05  -2.110e-08  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)    -199.05 1221734.18       0        1
k1               25.30  281753.45       0        1
k2               20.89  288426.19       0        1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 8.3178e+00  on 5  degrees of freedom
Residual deviance: 3.7636e-10  on 3  degrees of freedom
AIC: 6

Number of Fisher Scoring iterations: 24

glm中,formula参数是对待拟合模型的符号描述,data参数是包含模型中变量的可选数据框。

glm()logistic_regression 函数调用中,公式 y~k1+k2 中指示的模型变量未包含在 data=x 中(具有两列的数据框名为 X0X1),因此,取自调用 glm 的环境(您的 logistic_regression 函数)。该环境中的 3 个硬编码向量 (m, k1, k2) 与输入无关(即,在您的第二个场景中完成的 x=k1,k2 and y=m 步骤未在您的函数中发生)。

要使用您的 logistic_regression() 输入调用 glm(),您可以创建一个包含模型变量的数据框以用作单个输入并相应地编辑您的函数。例如,您可以使用:

x <- data.frame(y=c(1, 1, 1, 0, 0, 0), k1=c(4,3,5,1,2,3), k2= c(6,7,8,5,6,3))

logistic_regression <- function(x){
  glm.out <- glm(as.formula(paste("y~", paste(colnames(x[,-1]), collapse="+"))), family=binomial(logit), data=x)
  return(summary(glm.out))
}

logistic_regression(x)