在 R 中更改显著性符号表示法

5

R有特定的显著性代码来确定统计学上的显著性。例如,下面的例子中,点号.表示在10%的水平上具有显著性(请参见下面的示例输出)。

点可能很难看到,尤其是当我将其复制粘贴到Excel中并在Times New Roman中显示时。

我想改变它,使得:

  • * = 10%的显着性
  • ** = 5%的显着性
  • *** = 1%的显着性

我能做到这一点吗?

> y = c(1,2,3,4,5,6,7,8)
> x = c(1,3,2,4,5,6,8,7)
> summary(lm(y~x))

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.0714 -0.3333  0.0000  0.2738  1.1191 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.2143     0.6286   0.341  0.74480    
x             0.9524     0.1245   7.651  0.00026 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8067 on 6 degrees of freedom
Multiple R-squared:  0.907, Adjusted R-squared:  0.8915 
F-statistic: 58.54 on 1 and 6 DF,  p-value: 0.0002604

1
这是由 stats:::printCoefmat 打印的,其中硬编码了这些值。您可以通过调用 symnum() 使用自己的符号格式化 p 值,但是 summary.lm 的默认选项似乎无法配置。你真的要将这些结果粘贴到 Excel 中吗?呸。 - MrFlick
基本上是复制粘贴系数,然后使用“文本分列”功能使一切变得整齐。 - wwl
谢谢您推荐symnum,我会去查看一下。 - wwl
1
经常会有关于星号的问题,无论是在重新配置断点还是对它们过度自信。后者一点在美国统计协会中被提出,作为对p值过度或误用的警告。我甚至看到(非官方的)提到尝试从lm摘要报告中删除它们,尽管我目前找不到这些参考文献。 - r2evans
3个回答

8

您可以使用以下代码创建自己的格式化函数:

mystarformat <- function(x) symnum(x, corr = FALSE, na = FALSE, 
    cutpoints = c(0, 0.01, 0.05, 0.1, 1), 
    symbols = c("***", "**", "*", " "))

你可以编写自己的系数格式化程序

show_coef <- function(mm) {
     mycoef<-data.frame(coef(summary(mm)), check.names=F)
     mycoef$signif = mystarformat(mycoef$`Pr(>|t|)`)
     mycoef$`Pr(>|t|)` = format.pval(mycoef$`Pr(>|t|)`)
     mycoef
}

然后,使用您的模型,您可以运行以下命令:

mm <- lm(y~x)
show_coef(mm)
#              Estimate Std. Error   t value  Pr(>|t|) signif
# (Intercept) 0.2142857  0.6285895 0.3408993 0.7447995       
# x           0.9523810  0.1244793 7.6509206 0.0002604    ***

虽然很少见,但 p 值为 0 会返回 NA(因为默认情况下 cut 的分割点左侧是封闭的)。您可以通过将第一个切点从 0 更改为“某个较小的值”来减轻这种情况。 - r2evans
@r2evans 我基本上也是用 stats:::printCoefmat 做了同样的事情,所以我猜默认的 print.summary.lm 也会有同样的问题。 - MrFlick
非常正确,说得好。我猜我的统计结果从来没有“完美显著”。 - r2evans
@r2evans 实际上,mystarformat(0) 返回的是“***”,所以我猜这只是因为 symnumcut 不同的原因。 - MrFlick
啊哈,我看到了在symnum.R的第68行中对any(ii <- is.na(iS))的引用。抱歉,过早的缓解 :-) - r2evans

1

需要注意的是,stargazer软件包使用与其他统计软件(如STATA)不同的比例报告显著性水平。

在R(stargazer)中,您会看到# (* p<0.1; ** p<0.05; *** p<0.01)。而在STATA中,您会看到# (* p<0.05, ** p<0.01, *** p< 0.001)

这意味着,在R结果中用一个*表示显著性,在STATA用户看来可能并不显著。


顺便提一下,你可以更改stargazer包中的截断值,使其与其他软件的输出相同,例如如果你和合作者一起工作:stargazer(output, output2, type = "html", star.cutoffs = c(0.05, 0.01, 0.001)) # 默认情况下star.cutoffs = NULL - ibrahim shaheen

0

抱歉回复晚了,但我找到了一个很好的解决方案。只需按照以下步骤操作:

install.packages("stargazer")
library(stargazer)
stargazer(your_regression, type = "text")

这将以您所需的格式以美观的方式显示所有内容。 注意:如果您省略 type = "text",则会得到 LaTeX 代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接