留一法但对于 R 中的组
Leave-one-out but for groups in R
目标
Return 多个函数生成的列表中的项目作为数据框中的行。
示例数据:
delete<- structure(list(f = structure(c(2L, 3L, 2L, 1L, 1L, 4L, 4L, 5L, 3L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), n = c(3.86634168231333, 5.12320676294787, 7.43524756894488, 5.4483312206524, 4.6808590809153, 3.09435163890175, 3.3369519531068, 5.48377017072716, 3.22234879830383, 4.21889257443295), yi = c(7.8076602154975, 6.5323499682638, 4.59639499129274, 5.23921401222216, 6.06635185725809, 6.70450561710897, 6.80135195068635, 6.05939661908661, 6.57758084773293, 6.66031140517216), vi = c(0.974757327755975, 1.18471706886098, 0.887199336597602, 0.822433823427991, 0.988350739676306, 0.891992523606773, 0.882568180283011, 0.986873003631463, 0.970027651579457, 1.01797517893535)), .Names = c("f", "n","yi", "vi"), row.names = c(NA, -10L), class = "data.frame")
尝试
至少获得正确数字并跟踪 id 列(最低要求)"f" 值的东西,但我不知道如何操作:
for(i in unique(delete$f)) print(c(i,glm(data=delete[delete$f!=i,], yi~vi)$aic))
[1] "b" "16.1840991165046"
[1] "c" "25.6744104404786"
[1] "a" "25.6185827181431"
[1] "d" "24.600830735108"
[1] "e" "26.4382751230764"
这里有很多帖子 (1,,3,4) 介绍了在个别行而不是组中进行留一法的正确方法。
问题
我不知道如何获取与此输出内容相同的数据框。单独解决这个问题将是巨大的。第二个问题是,即使我克服了这个问题,如果我还想要模型系数,我必须替换上面代码中的 $aic,然后合并两个数据帧。
我知道我可以使用 lapply 并拆分,如果我想要按数据子集的结果,我如何做相反的事情并按排除特定组的子集获得结果?
总结
我想做一个留一法分析,在这种情况下,我不会遗漏个别观察结果,而是会遗漏组(在本例中由向量的共同水平 "f" 标识)。
附录
这实际上是为 metafor 的 rma 函数的一些输出实现的,但我使用 glm 作为一个更通用的例子(将 "glm" 替换为 "rma" 和 "aic"使用 "ci.lb",这是我的问题)。与我上面所说的类似,metafor 有一个内置的 leave1out 函数,用于遗漏单行数据而不是组。
您仍然可以使用 lapply。这是许多可能的解决方案之一。
results <- lapply(unique(delete$f), function(i) {
data.frame(i=i, AIC=glm(data=delete[delete$f!=i,], yi~vi)$aic)
})
results_df <- do.call(rbind, results)
results_df
i AIC
1 b 16.18410
2 c 25.67441
3 a 25.61858
4 d 24.60083
5 e 26.43828
目标
Return 多个函数生成的列表中的项目作为数据框中的行。
示例数据:
delete<- structure(list(f = structure(c(2L, 3L, 2L, 1L, 1L, 4L, 4L, 5L, 3L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), n = c(3.86634168231333, 5.12320676294787, 7.43524756894488, 5.4483312206524, 4.6808590809153, 3.09435163890175, 3.3369519531068, 5.48377017072716, 3.22234879830383, 4.21889257443295), yi = c(7.8076602154975, 6.5323499682638, 4.59639499129274, 5.23921401222216, 6.06635185725809, 6.70450561710897, 6.80135195068635, 6.05939661908661, 6.57758084773293, 6.66031140517216), vi = c(0.974757327755975, 1.18471706886098, 0.887199336597602, 0.822433823427991, 0.988350739676306, 0.891992523606773, 0.882568180283011, 0.986873003631463, 0.970027651579457, 1.01797517893535)), .Names = c("f", "n","yi", "vi"), row.names = c(NA, -10L), class = "data.frame")
尝试
至少获得正确数字并跟踪 id 列(最低要求)"f" 值的东西,但我不知道如何操作:
for(i in unique(delete$f)) print(c(i,glm(data=delete[delete$f!=i,], yi~vi)$aic))
[1] "b" "16.1840991165046"
[1] "c" "25.6744104404786"
[1] "a" "25.6185827181431"
[1] "d" "24.600830735108"
[1] "e" "26.4382751230764"
这里有很多帖子 (1,
问题
我不知道如何获取与此输出内容相同的数据框。单独解决这个问题将是巨大的。第二个问题是,即使我克服了这个问题,如果我还想要模型系数,我必须替换上面代码中的 $aic,然后合并两个数据帧。
我知道我可以使用 lapply 并拆分,如果我想要按数据子集的结果,我如何做相反的事情并按排除特定组的子集获得结果?
总结
我想做一个留一法分析,在这种情况下,我不会遗漏个别观察结果,而是会遗漏组(在本例中由向量的共同水平 "f" 标识)。
附录
这实际上是为 metafor 的 rma 函数的一些输出实现的,但我使用 glm 作为一个更通用的例子(将 "glm" 替换为 "rma" 和 "aic"使用 "ci.lb",这是我的问题)。与我上面所说的类似,metafor 有一个内置的 leave1out 函数,用于遗漏单行数据而不是组。
您仍然可以使用 lapply。这是许多可能的解决方案之一。
results <- lapply(unique(delete$f), function(i) {
data.frame(i=i, AIC=glm(data=delete[delete$f!=i,], yi~vi)$aic)
})
results_df <- do.call(rbind, results)
results_df
i AIC
1 b 16.18410
2 c 25.67441
3 a 25.61858
4 d 24.60083
5 e 26.43828