【问题标题】:R how to do multiple GLMs for each level for a factor in my data.frame?R如何为我的data.frame中的一个因素为每个级别执行多个GLM?
【发布时间】:2015-05-06 16:25:49
【问题描述】:

是否有适当的方法来进行 R 风格的逻辑回归,我避免使用循环,但我可以对特定因素的每个级别进行多个回归?

例如,假设 df 是每天 365 行,用二进制表示是否下雨:

multifactorglm(x){
  glm(rained ~ temp + humidity, data=x, family="binomial")
}
tapply(df, month, multifactorglm)

这不会在 R 中运行并显示以下消息...

Error: unexpected '{' in "multifactorglm(x){"
>   glm(rained ~ temp + humidity, data=x, family="binomial")
Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one
> }
Error: unexpected '}' in "}"
> 

我希望得到一个包含 12 个 glm 回归的向量,但我不想使用循环。我该怎么办?

【问题讨论】:

  • 这看起来更像是一个错字。您能否提供一个可重现的示例?也......见lme4::lmList(它做GLMs以及线性模型)
  • 同意错误信息提示有错字。 tapply 是一个变相的循环。如果没有令人信服的理由,例如家庭作业问题规范,那么只需使用直接且同样有效的for 循环,将月份值传递给glm 并使用子集参数。我可以想到一个完全无环的方法,使用“月”作为与其他变量的交互,但解释输出似乎有点巴洛克风格。如果需要向量或矩阵,则需要提取系数,因为glm 的结果是一个列表。

标签: r loops glm tapply


【解决方案1】:

我认为该错误是由于未能理解 R 定义函数的语法(以及不知道诸如“月”之类的列名不能用作全局变量而导致的进一步错误。请尝试:

multifactorglm <- function(x){
  glm(rained ~ temp + humidity, data=x, family="binomial")
}
do.call(rbind, do(df, df$month, multifactorglm) )

如果你真的想要一个完全数字的结果,它可能是:

multifactorglm<- function(x){
  coef( glm(rained ~ temp + humidity, data=x, family="binomial") )
}
do.call( rbind, do(df, df$month, multifactorglm) )

...我认为这将是一个具有 3 列(截距和两个参数列)的矩阵...尽管它在没有数据的情况下未经测试。看着我的第一次努力,我意识到 tapply 不会正确拆分数据帧。您可能需要使用 lapply (split(df, df$month) ,multifactorglm)do 函数,该函数在内部对行名使用 tapply

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 2019-03-09
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多