【问题标题】:Dynamic number of X values (dependent variables) in glm function in R isn't giving the right outputR中glm函数中X值(因变量)的动态数量没有给出正确的输出
【发布时间】:2017-02-25 09:10:34
【问题描述】:

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

  • 输入的 x,y 值直接取自代码的 python 部分,并转换为正确的格式,并传递给 R 中的 logestic_regression 函数。来自 python 的输入值打印在下面(第二个代码块)。 glm 使用 as.formula 在这些值上运行。这给了我一个输出(第四块代码)
  • 输入 x,y 值刚刚在 R 中创建,如代码中所给(在本例中 x=k1,k2 和 y=m。)并且 glm 函数以传统方式运行。这给了我不同的输出(第 6 块代码)

输入的数字是正确的。但是格式不一样。第一个场景 - 一个数据框和第二个 - 向量。 或者我的 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

【问题讨论】:

    标签: python r logistic-regression glm rpy2


    【解决方案1】:

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

    在您的glm() 的logistic_regression 函数调用中,公式y~k1+k2 中指示的模型变量不包含在data=x(具有两列名为X0 和X1 的数据框)中,因此,取自调用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 2020-06-12
      • 2021-04-28
      相关资源
      最近更新 更多