gpt4 book ai didi

r - 按因子值将数据帧分成子集,发送到返回 glm 类的函数,如何重新组合?

转载 作者:行者123 更新时间:2023-12-02 08:58:44 25 4
gpt4 key购买 nike

感谢 Hadley 的 plyr 包 ddply 函数,我们可以获取一个数据帧,按因子将其分解为子数据帧,将每个子数据帧发送到一个函数,然后将每个子数据帧的函数结果组合成一个新的数据帧。

但是,如果函数返回像 glm 这样的类的对象,或者在我的例子中,是 c("glm", "lm")。那么,这些不能组合成一个数据框,不是吗?我收到此错误

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class 'c("glm", "lm")' into a data.frame

是否有一些更灵活的数据结构可以容纳我的函数调用的所有复杂的 glm 类结果,并保留有关数据帧子集的信息?

或者应该以完全不同的方式完成?

最佳答案

只是为了扩展我的评论:plyr 有一组组合输入和输出类型的函数。因此,当您的函数返回无法转换为 data.frame 的内容时,您应该使用 list 作为输出。因此,不要使用 ddply,而是使用 dlply

当您想要对每个模型执行某些操作并将结果转换为 data.frame 时,ldply 就是关键。

让我们使用dlply创建一些模型

list_of_models <- dlply(warpbreaks, .(tension), function(X) lm(breaks~wool, data=X))
str(list_of_models, 1)
# List of 3
# $ L:List of 13
# ..- attr(*, "class")= chr "lm"
# $ M:List of 13
# ..- attr(*, "class")= chr "lm"
# $ H:List of 13
# ..- attr(*, "class")= chr "lm"
# - attr(*, "split_type")= chr "data.frame"
# - attr(*, "split_labels")='data.frame': 3 obs. of 1 variable:

它给出了三个 lm 模型的列表

使用ldply您可以创建一个data.frame,例如

  • 每个模型的预测:

    ldply(list_of_models, function(model) {
    data.frame(fit=predict(model, warpbreaks))
    })
    # tension fit
    # 1 L 44.5556
    # 2 L 44.5556
    # 3 L 44.5556
  • 每个模型的统计数据:

    ldply(list_of_models, function(model) {
    c(
    aic = extractAIC(model),
    deviance = deviance(model),
    logLik = logLik(model),
    confint = confint(model),
    coef = coef(model)
    )
    })
    # tension aic1 aic2 deviance logLik confint1 confint2 confint3 confint4 coef.(Intercept) coef.woolB
    # 1 L 2 98.3291 3397.78 -72.7054 34.2580 -30.89623 54.8531 -1.77044 44.5556 -16.33333
    # 2 M 2 81.1948 1311.56 -64.1383 17.6022 -4.27003 30.3978 13.82559 24.0000 4.77778
    # 3 H 2 76.9457 1035.78 -62.0137 18.8701 -13.81829 30.2411 2.26273 24.5556 -5.77778

关于r - 按因子值将数据帧分成子集,发送到返回 glm 类的函数,如何重新组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com