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 种不同场景的测试。
- 输入的 x,y 值直接取自代码的 python 部分,并转换为正确的格式,然后传递给 R 中的 logestic_regression 函数。来自 python 的输入值打印在下面(第二个代码块)。 glm 使用 as.formula 在这些值上 运行。这给了我一个输出(第 4 段代码)
- 输入的 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
在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)
用于逻辑回归的 R-glm。我试图根据另一个堆栈溢出 post 向公式动态输入值。
该函数是使用 rpy2 从 python 调用的。当我打印出 summery(glm.out).
我 运行 针对 2 种不同场景的测试。
- 输入的 x,y 值直接取自代码的 python 部分,并转换为正确的格式,然后传递给 R 中的 logestic_regression 函数。来自 python 的输入值打印在下面(第二个代码块)。 glm 使用 as.formula 在这些值上 运行。这给了我一个输出(第 4 段代码)
- 输入的 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
在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)