我创建了一个回归模型我想估计每个因素的影响分析。
意义取特定因子的平方Wald估计(z值)并将其除以其Wald估计的平方和。以及我如何估计特定因素的影响。
我的问题是这些因素除以它们的水平。
我举一个例子:
model<-glm(formula = form,
family = binomial("logit"),
data = Train)
View(summary(model)$coefficients)
在表格中我们可以看到因子dom_time_Colnames
分为4个等级。 first_byte_downdload_Colnames
发生了同样的事情。
我想要考虑因子z值而不是它们的水平z值。
我是怎么做到的? anova()
是一个好主意,但它并没有停止为我跑。我寻找创造性的解决方案,给我输出像glm摘要中的z值或anova中的所有因素而不是他们的水平。
以下是一个可重复的示例:
Data<-data.frame(Species=iris$Species)
for(i in 1:ncol(iris)){
if(is.numeric(iris[,i])){
result=quantile(x = iris[,i],probs = seq(0,1,0.1))
out<-cut(iris[,i], breaks = unique(result),include.lowest = TRUE)
Data<-data.frame(Data,out)
colnames(Data)[length(Data)]<-colnames(iris)[i]
} else {
next()
}
}
Data$y<-rbinom(n = nrow(Data),size = 1,prob = 0.1)
form<-formula(y~.)
model<-glm(formula = form,
family = binomial("logit"),
data = Data)
View(summary(model)$coefficients)
我们可以看到因子萼片或花瓣分为其水平。
答案 0 :(得分:1)
正如我已经提到的那样,R
在使用glm
时将因子变量转换为虚拟变量。这使我觉得直观,因为否则它将使用任意数值,用于编码因子水平。
您可以使用F检验来查看多个变量是否一致。
在这里,我们要测试所有假人是否都是重要的(换句话说,整个因子变量)。这可以通过首先拟合一个包含因子的模型和一个跳过因子变量的模型来完成。在第二步中,您可以将两个模型传递给测试函数(这里我们使用lmtest::waldtest
)。
这是我的建议:
一句话:我将y变量的概率从0.1改为0.3。否则,P值几乎总是变为1。
library(lmtest)
## The full model containing all variables
full_formula <- formula(y~ Species + Sepal.Length + Sepal.Width + Petal.Length + Petal.Width)
full_model <- glm(formula = full_formula,
family = binomial("logit"),
data = Data)
## Reduced models (leaving out each variable once)
reduced_models <- list()
for(i in 1:(ncol(Data)-1)) {
reduced_formulas <- as.formula(paste0("y ~ ", paste(names(Data)[c(-i ,-ncol(Data))], collapse= " + " )))
reduced_models[[i]] <- glm(formula = reduced_formulas,
family = binomial("logit"),
data = Data)
}
## Test the full model against all reduced models
result <- lapply(reduced_models, waldtest, full_model)
##Add the name of the tested variable
names(result) <- names(Data[ ,-ncol(Data)])
前三个结果:
> result[1:3]
$Species
Wald test
Model 1: y ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Model 2: y ~ Species + Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Res.Df Df F Pr(>F)
1 115
2 113 2 0.1116 0.8945
$Sepal.Length
Wald test
Model 1: y ~ Species + Sepal.Width + Petal.Length + Petal.Width
Model 2: y ~ Species + Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Res.Df Df F Pr(>F)
1 122
2 113 9 0.7051 0.7031
$Sepal.Width
Wald test
Model 1: y ~ Species + Sepal.Length + Petal.Length + Petal.Width
Model 2: y ~ Species + Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Res.Df Df F Pr(>F)
1 121
2 113 8 0.1743 0.9939
第一个列表条目测试了因子变量species
是否重要,第二个是Sepal.Length
是否重要等等。
由于y
变量完全是随机的,因此所有测试都具有较高的P值并不奇怪。
*修改
您还可以使用anova()
:
result_anova <- lapply(reduced_models, anova, full_model)
names(result_anova) <- names(Data[ ,-ncol(Data)])
仅第一个变量的结果:
> result_anova[[1]]
Analysis of Deviance Table
Model 1: y ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Model 2: y ~ Species + Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Resid. Df Resid. Dev Df Deviance
1 115 149.16
2 113 146.87 2 2.2914
答案 1 :(得分:0)
鉴于您在评论中澄清了您的意思,&#34;变量重要性&#34;实际上是统计意义,我建议你使用似然比检验。对于简单到简单的假设,这些是统一最强大的(UMP)测试,对于复合假设仍然是理想的。
Wald测试选项,其他@Alex建议的选项,是另一种选择。 LRT和Wald测试是渐近等价的。虽然,对于简单的简单假设,LRT是UMP,因此是优选的。
# using your Data argument, here are nested models:
model1<-glm(y ~ ., family = binomial("logit"), data = Data)
model2 <- glm(y ~ Sepal.Length + Sepal.Width + Petal.Length,
family= binomial("logit"), data= Data)
# LRT model1 vs the null hypothesis
pchisq(model1$null.deviance - model1$deviance,
model1$df.null - model1$df.residual, lower= FALSE)
[1] 0.1721306
# nested model LRT
pchisq(model2$deviance - model1$deviance,
model2$df.residual - model1$df.residual, lower= FALSE)
[1] 0.05313724
在这两种情况下,由于pchisq
&gt; 0.05(标准默认显着性水平)我们不拒绝需要额外协变量的零假设。对于此数据集,我们将选择null模型。与您的问题更相关:对于嵌套模型LRT,不需要附加条款(例如model1
)。
同样,这不是&#34;变量重要性&#34; (例如,Breiman 2001)。它是衡量合身度的指标。