如何获得具有估算数据的合并模型的R^2、F统计和p值



我使用小鼠估算了具有估算数据的回归模型。

model1 <- with(imp, lm(outcome~ predictor1+ predictor2+ predictor3+ predictor4))). 

在输出中,我通过获得了一些信息

summary(pool(model1), conf.int = TRUE)

如估计值、标准误差和p值。现在我想知道整个模型的F值和R^2。

对于R^2,我找到了以下代码:pool.r.squared(model1)。但我仍在寻找一个代码来显示F值。有人有这方面的经验吗?

我们通过对anova的F值进行平均来获得常规的F统计,比较:

mean(anova(aov(bmi ~ hyp + chl, nhanes))[, 4], na.rm=TRUE)
summary(lm(bmi ~ hyp + chl, nhanes))$fstatistic[1]

对于合并分析,我们可以使用miceadds::mi.anova来获得R^2和F统计量。

library('miceadds')
nul <- capture.output(
aov_fit <- miceadds::mi.anova(mi.res=imp, formula="bmi ~ hyp + chl" )
)

(不一定需要capture.output,但可以防止控制台混乱。(

所需的信息现在被存储在对象CCD_ 5中。

aov_fit$r.squared  ## R-squared
# [1] 0.1158705
(fval <- mean(round(aov_fit$anova.table$`F value`, 2), na.rm=TRUE) ) ## F-statistic
# [1] 0.97
df_mod <- aov_fit$anova.table$df1[- nrow(aov_fit$anova.table)]  ## DF model
df_res <- el(fit$analyses)$df.residual  ## DF residual
c(df_mod, df_res)
# [1]  1  1 22

模型p值可以通过使用F分布pf()的分布函数的右尾检验来计算。

pf(q=fval, df1=sum(df_mod), df_2=df_res, lower.tail=FALSE)  ## p-value
# [1] 0.3947152

我们现在可以使用sprintf在某种程度上类似于lm():的GOF度量

sprintf('Pooled R-squared: %s', round(aov_fit$r.squared, 4))
# [1] "Pooled R-squared: 0.1159"
tmp <- aov_fit$anova.table
sprintf('Pooled F-statistic: %s on %s and %s DF,  p-value: %s', 
mean(round(tmp$`F value`, 2), na.rm=TRUE), 
round(sum(tmp$df1[- nrow(aov_fit$anova.table)]), 2),
round(el(fit$analyses)$df.residual, 2),
format.pval(pf(fval, sum(df_mod), df_res, lower.tail=FALSE)))
# [1] "Pooled F-statistic: 0.97 on 2 and 22 DF,  p-value: 0.39472"

更新

为了得到r2adj,我们可以使用通常的公式,

adjR2 <- (r2, n, p) {
1 - (n - 1)/(n - p - 1)*(1 - r2)
}
adjR2(aov_fit$r.squared, nrow(nhanes), sum(aov_fit$anova.table$df1, na.rm=TRUE))
# [1] 0.03549512

其中n=观测次数,p=参数数量。


数据:

使用mice包的nhanes数据集。

library('mice')
set.seed(42)
imp <- mice(nhanes, m=100, printFlag=FALSE)
fit <- with(data=imp, exp=lm(bmi ~ hyp + chl))

最新更新