【问题标题】:Extract pvalue from glm从 glm 中提取 pvalue
【发布时间】:2014-07-13 09:16:27
【问题描述】:

我正在运行许多回归,并且只对一个特定变量的系数和 p 值的影响感兴趣。因此,在我的脚本中,我希望能够从 glm 摘要中提取 p 值(获取系数本身很容易)。我知道查看 p 值的唯一方法是使用 summary(myReg)。还有其他方法吗?

例如:

fit <- glm(y ~ x1 + x2, myData)
x1Coeff <- fit$coefficients[2] # only returns coefficient, of course
x1pValue <- ???

我尝试将 fit$coefficients 视为矩阵,但仍然无法简单地提取 p 值。

可以这样做吗?

谢谢!

【问题讨论】:

    标签: r glm p-value


    【解决方案1】:

    你想要

    coef(summary(fit))[,4]
    

    summary(fit) 显示的表格输出中提取p 值的列向量。 p 值在您对模型拟合运行 summary() 之前不会实际计算。

    顺便说一句,如果可以的话,请使用提取函数而不是深入研究对象:

    fit$coefficients[2]
    

    应该是

    coef(fit)[2]
    

    如果没有提取函数,str() 是你的朋友。它允许您查看任何对象的结构,从而可以查看对象包含的内容以及如何提取它:

    summ <- summary(fit)
    
    > str(summ, max = 1)
    List of 17
     $ call          : language glm(formula = counts ~ outcome + treatment, family = poisson())
     $ terms         :Classes 'terms', 'formula' length 3 counts ~ outcome + treatment
      .. ..- attr(*, "variables")= language list(counts, outcome, treatment)
      .. ..- attr(*, "factors")= int [1:3, 1:2] 0 1 0 0 0 1
      .. .. ..- attr(*, "dimnames")=List of 2
      .. ..- attr(*, "term.labels")= chr [1:2] "outcome" "treatment"
      .. ..- attr(*, "order")= int [1:2] 1 1
      .. ..- attr(*, "intercept")= int 1
      .. ..- attr(*, "response")= int 1
      .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
      .. ..- attr(*, "predvars")= language list(counts, outcome, treatment)
      .. ..- attr(*, "dataClasses")= Named chr [1:3] "numeric" "factor" "factor"
      .. .. ..- attr(*, "names")= chr [1:3] "counts" "outcome" "treatment"
     $ family        :List of 12
      ..- attr(*, "class")= chr "family"
     $ deviance      : num 5.13
     $ aic           : num 56.8
     $ contrasts     :List of 2
     $ df.residual   : int 4
     $ null.deviance : num 10.6
     $ df.null       : int 8
     $ iter          : int 4
     $ deviance.resid: Named num [1:9] -0.671 0.963 -0.17 -0.22 -0.956 ...
      ..- attr(*, "names")= chr [1:9] "1" "2" "3" "4" ...
     $ coefficients  : num [1:5, 1:4] 3.04 -4.54e-01 -2.93e-01 1.34e-15 1.42e-15 ...
      ..- attr(*, "dimnames")=List of 2
     $ aliased       : Named logi [1:5] FALSE FALSE FALSE FALSE FALSE
      ..- attr(*, "names")= chr [1:5] "(Intercept)" "outcome2" "outcome3" "treatment2" ...
     $ dispersion    : num 1
     $ df            : int [1:3] 5 4 5
     $ cov.unscaled  : num [1:5, 1:5] 0.0292 -0.0159 -0.0159 -0.02 -0.02 ...
      ..- attr(*, "dimnames")=List of 2
     $ cov.scaled    : num [1:5, 1:5] 0.0292 -0.0159 -0.0159 -0.02 -0.02 ...
      ..- attr(*, "dimnames")=List of 2
     - attr(*, "class")= chr "summary.glm"
    

    因此我们注意到coefficients 组件,我们可以使用coef() 提取它,但其他组件没有提取器,例如null.deviance,您可以将其提取为summ$null.deviance

    【讨论】:

    • 你在我寻找骗子的时候打败了我(没有完美的重复,但有很多关于从[g]lm 中提取内容的帖子适合:例如stackoverflow.com/questions/12496368/…
    • 当您不知道有哪些可用的访问器并且必须尝试自己从对象中挖掘东西时,可能值得在 str() 上添加评论。
    • 实际上,我使用 str() 试图弄清楚如何获取数据,但我看不到 str() 中的哪个位置我可以推断出我需要 coef() 函数得到我正在寻找的东西。我正在阅读您的更新,但我仍然没有看到...
    • @Ben 我找了几次其他帖子,但没有找到。
    • 了解coef 的方法是methods(class="lm")methods(class="summary.lm")。我同意您无法通过查看 str() 来确定您可以使用 coef()
    【解决方案2】:

    我过去曾使用此技术从 summary 或拟合模型对象中提取预测数据:

    coef(summary(m))[grepl("var_i_want$",row.names(coef(summary(m)))), 4]
    

    这让我可以轻松地编辑我想要获取数据的变量。

    或者如@Ben所指出的,使用match%in%,比grepl更干净:

    coef(summary(m))[row.names(coef(summary(m))) %in% "var_i_want" , 4]
    

    【讨论】:

    • 或者使用match() ...或者只是适当地索引行
    【解决方案3】:

    你可以直接输入名字而不是数字

    coef(summary(fit))[,'Pr(>|z|)']
    

    系数摘要中的其他可用:

    Estimate Std. Error z value Pr(&gt;|z|)

    【讨论】:

      【解决方案4】:

      嗯,这将是另一种方式,但不是最有效的方式:

      a = coeftable(model).cols[4]
      pVals = [ a[i].v for i in 1:length(a) ]
      

      这确保从 glm 中提取的值不在 StatsBase 中。 其中,您可以根据自己的要求使用 pVals。 希望能帮助到你, 埃比

      【讨论】:

        【解决方案5】:

        broom 包中的tidy 函数(Tidyverse 的一部分,可在 CRAN 上获得)提供了一种将 GLM 摘要转换为数据框的快速简便的方法,这可能在许多上述情况以外的情况。

        在这种情况下,您可以使用代码获得所需的输出:

        x1pValue <- broom::tidy(fit)$p.value[2]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-19
          • 2018-11-19
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          • 2012-09-27
          相关资源
          最近更新 更多