我有一个结果变量,比如Y和一个可能影响Y的20个变量的列表(比如X1 ... X20)。我想测试哪些变量不与Y无关。为了做到这一点,我想为每个变量和Y运行一个单变量glm(即Y~X1,...,Y~X20),然后进行似然比检验每个型号。最后,我想创建一个表,其中包含每个模型的似然检验得到的P值。
从我所看到的lapply函数和split函数可能对此有用,但我真的不明白它们在我看过的例子中是如何工作的。
这是我最初尝试过的:
> VarNames<-c(names(data[30:47]))
> glms<-glm(intBT~VarNames,family=binomial(logit))
Error in model.frame.default(formula = intBT ~ VarNames, drop.unused.levels = TRUE) :
variable lengths differ (found for 'VarNames')
我不确定这是否是一个好方法。
答案 0 :(得分:1)
如果您提供minimal example,则更容易回答您的问题。
一种方法 - 但肯定不是最美丽的 - 是使用粘贴来创建公式作为字符串的向量,然后使用lapply。该代码可能如下所示:
example.data <- data.frame(intBT=1:10, bli=1:10, bla=1:10, blub=1:10)
var.names <- c('bli', 'bla', 'blub')
formulas <- paste('intBT ~', var.names)
fitted.models <- lapply(formulas, glm, data=example.data)
这给出了拟合模型的列表。然后,您可以使用fits.models上的apply函数执行进一步的测试。
答案 1 :(得分:0)
就像保罗所说,如果你提供一个最小的例子,它确实有帮助,但我认为这可以做你想要的。
set.seed(123)
N <- 100
num_vars <- 5
df <- data.frame(lapply(1:num_vars, function(i) i = rnorm(N)))
names(df) <- c(paste0(rep("X",5), 1:num_vars ))
e <- rnorm(N)
y <- as.numeric((df$X1 + df$X2 + e) > 0.5)
pvalues <- vector(mode = "list")
singlevar <- function(var, y, df){
model <- as.formula(paste0("y ~ ", var))
pvalues[var] <- coef(summary(glm(model, family = "binomial", data = df)))[var,4]
}
sapply(colnames(df), singlevar, y, df)
X1 X2 X3 X4 X5
1.477199e-04 4.193461e-05 8.885365e-01 9.064953e-01 9.702645e-01
进行比较:
Call:
glm(formula = y ~ X2, family = "binomial", data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.0674 -0.8211 -0.5296 0.9218 2.5463
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.5591 0.2375 -2.354 0.0186 *
X2 1.2871 0.3142 4.097 4.19e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 130.68 on 99 degrees of freedom
Residual deviance: 106.24 on 98 degrees of freedom
AIC: 110.24
Number of Fisher Scoring iterations: 4