在 R 中使用 Amelia,我获得了多个估算数据集。之后,我在 SPSS 中进行了重复测量测试。现在,我想汇总测试结果。我知道我可以使用 Rubin 的规则(通过 R 中的任何多重插补包实现)来汇集均值和标准误差,但是如何汇集 p 值?是否可以?R中是否有这样做的功能?提前致谢。
如何在多个估算数据集中完成的测试中获得合并的 p 值?
机器算法验证
r
spss
p 值
多重插补
汇集
2022-02-13 08:47:09
2个回答
是的,这是可能的,是的,有一些R
功能可以做到这一点。您可以使用包,而不是手动计算重复分析的 p 值,该包Zelig
也在 -package 的小插图中提到Amelia
(有关更多信息的方法,请参阅下面的更新)。我将使用Amelia
-vignette 中的一个示例来演示这一点:
library("Amelia")
data(freetrade)
amelia.out <- amelia(freetrade, m = 15, ts = "year", cs = "country")
library("Zelig")
zelig.fit <- zelig(tariff ~ pop + gdp.pc + year + polity, data = amelia.out$imputations, model = "ls", cite = FALSE)
summary(zelig.fit)
值的相应输出:
Model: ls
Number of multiply imputed data sets: 15
Combined results:
Call:
lm(formula = formula, weights = weights, model = F, data = data)
Coefficients:
Value Std. Error t-stat p-value
(Intercept) 3.18e+03 7.22e+02 4.41 6.20e-05
pop 3.13e-08 5.59e-09 5.59 4.21e-08
gdp.pc -2.11e-03 5.53e-04 -3.81 1.64e-04
year -1.58e+00 3.63e-01 -4.37 7.11e-05
polity 5.52e-01 3.16e-01 1.75 8.41e-02
For combined results from datasets i to j, use summary(x, subset = i:j).
For separate results, use print(summary(x), subset = i:j).
zelig
可以拟合除最小二乘以外的许多模型。
要获得估计的置信区间和自由度,您可以使用mitools
:
library("mitools")
imp.data <- imputationList(amelia.out$imputations)
mitools.fit <- MIcombine(with(imp.data, lm(tariff ~ polity + pop + gdp.pc + year)))
mitools.res <- summary(mitools.fit)
mitools.res <- cbind(mitools.res, df = mitools.fit$df)
mitools.res
这将为您提供置信区间和可归因于缺失数据的总方差比例:
results se (lower upper) missInfo df
(Intercept) 3.18e+03 7.22e+02 1.73e+03 4.63e+03 57 % 45.9
pop 3.13e-08 5.59e-09 2.03e-08 4.23e-08 19 % 392.1
gdp.pc -2.11e-03 5.53e-04 -3.20e-03 -1.02e-03 21 % 329.4
year -1.58e+00 3.63e-01 -2.31e+00 -8.54e-01 57 % 45.9
polity 5.52e-01 3.16e-01 -7.58e-02 1.18e+00 41 % 90.8
当然,您可以将有趣的结果组合到一个对象中:
combined.results <- merge(mitools.res, zelig.res$coefficients[, c("t-stat", "p-value")], by = "row.names", all.x = TRUE)
更新
经过一番尝试,我找到了一种更灵活的方法来使用mice
-package 获取所有必要的信息。为此,您需要修改包的as.mids()
-function。使用我后续问题中发布的 Gerko 版本:
as.mids2 <- function(data2, .imp=1, .id=2){
ini <- mice(data2[data2[, .imp] == 0, -c(.imp, .id)], m = max(as.numeric(data2[, .imp])), maxit=0)
names <- names(ini$imp)
if (!is.null(.id)){
rownames(ini$data) <- data2[data2[, .imp] == 0, .id]
}
for (i in 1:length(names)){
for(m in 1:(max(as.numeric(data2[, .imp])))){
if(!is.null(ini$imp[[i]])){
indic <- data2[, .imp] == m & is.na(data2[data2[, .imp]==0, names[i]])
ini$imp[[names[i]]][m] <- data2[indic, names[i]]
}
}
}
return(ini)
}
有了这个定义,您可以继续分析估算的数据集:
library("mice")
imp.data <- do.call("rbind", amelia.out$imputations)
imp.data <- rbind(freetrade, imp.data)
imp.data$.imp <- as.numeric(rep(c(0:15), each = nrow(freetrade)))
mice.data <- as.mids2(imp.data, .imp = ncol(imp.data), .id = NULL)
mice.fit <- with(mice.data, lm(tariff ~ polity + pop + gdp.pc + year))
mice.res <- summary(pool(mice.fit, method = "rubin1987"))
这将为您提供您使用的所有结果Zelig
等等mitools
:
est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
(Intercept) 3.18e+03 7.22e+02 4.41 45.9 6.20e-05 1.73e+03 4.63e+03 NA 0.571 0.552
pop 3.13e-08 5.59e-09 5.59 392.1 4.21e-08 2.03e-08 4.23e-08 0 0.193 0.189
gdp.pc -2.11e-03 5.53e-04 -3.81 329.4 1.64e-04 -3.20e-03 -1.02e-03 0 0.211 0.206
year -1.58e+00 3.63e-01 -4.37 45.9 7.11e-05 -2.31e+00 -8.54e-01 0 0.570 0.552
polity 5.52e-01 3.16e-01 1.75 90.8 8.41e-02 -7.58e-02 1.18e+00 2 0.406 0.393
请注意,pool()
您还可以使用通过省略 -参数更好的是,您现在还可以计算并比较嵌套模型:method
pool.r.squared(mice.fit)
mice.fit2 <- with(mice.data, lm(tariff ~ polity + pop + gdp.pc))
pool.compare(mice.fit, mice.fit2, method = "Wald")$pvalue
通常,您可以通过将鲁宾规则应用于回归权重等常规统计参数来获取 p 值。因此,通常不需要直接汇集 p 值。此外,可以汇集似然比统计数据以比较模型。其他统计数据的合并过程可以在我的书《缺失数据的灵活插补》第 6 章中找到。
在没有已知分布或方法的情况下,Licht 和 Rubin 有一个未公开的程序用于单边测试。我使用此过程从过程中汇集 p 值wilcoxon()
,但它是通用且直接的以适应其他用途。
仅当所有其他方法都失败时才使用下面的过程,就目前而言,我们对其统计特性知之甚少。
lichtrubin <- function(fit){
## pools the p-values of a one-sided test according to the Licht-Rubin method
## this method pools p-values in the z-score scale, and then transforms back
## the result to the 0-1 scale
## Licht C, Rubin DB (2011) unpublished
if (!is.mira(fit)) stop("Argument 'fit' is not an object of class 'mira'.")
fitlist <- fit$analyses
if (!inherits(fitlist[[1]], "htest")) stop("Object fit$analyses[[1]] is not an object of class 'htest'.")
m <- length(fitlist)
p <- rep(NA, length = m)
for (i in 1:m) p[i] <- fitlist[[i]]$p.value
z <- qnorm(p) # transform to z-scale
num <- mean(z)
den <- sqrt(1 + var(z))
pnorm( num / den) # average and transform back
}
其它你可能感兴趣的问题