如何使用stargazer在科学计数法中显示系数

7 浏览
0 Comments

如何使用stargazer在科学计数法中显示系数

我想在R中使用stargazer或类似工具将不同模型(lm,glm,plm,pglm)的结果进行比较,并在表格中显示。然而,我无法找到一种方法将系数显示为科学计数法。这是一个问题,因为截距非常大(约为一百万),而其他系数很小(约为e-7),导致表格中有很多无用的零,使其更难阅读。\n我在这里找到了一个类似的问题:Format model display in texreg or stargazer R as scientific。\n但那里的结果需要重新调整变量,而我使用的是计数数据,我不想重新调整它。\n对于任何建议,我都非常感激。

0
0 Comments

如何使用stargazer显示科学计数法中的系数

问题的出现原因:

在使用stargazer时,默认情况下,系数会以标准浮点数形式显示,而不是科学计数法形式。然而,有时候科学计数法的显示方式更为适合,因此需要找到一种方法来调整系数的显示格式。

解决方法:

一种可行的方法是通过修改"digit.separator"参数来实现。该参数允许用户指定小数点的分隔符(大多数语境中通常是句点“.”)。我们可以利用这个参数,在我们希望使用正则表达式查找的任何数字中插入一个唯一可识别的字符串。通过这种方式搜索数字的优势在于,我们只会找到与stargazer输出中的数值对应的数字。也就是说,不会匹配变量名中的数字(例如X_12345)或者latex格式化代码中的数字(例如\hline \\[-1.8ex])。在下面的代码中,我使用字符串"::::"作为唯一标识符,但是任何在表格中找不到的特殊字符串(如哈希值)都可以使用。最好避免在标识符标记中包含任何特殊的正则表达式字符,因为这会稍微复杂化事情。

以下是使用stargazer和正则表达式进行搜索和替换的示例代码:

mark = '::::'
star = stargazer(m1, header = F, decimal.mark = mark, digit.separator = '')
replace_numbers = function(x, low=0.01, high=1e3, digits = 3, scipen=-7, ...) {
  x = gsub(mark,'.',x)
  x.num = as.numeric(x)
  ifelse(
    (x.num >= low) & (x.num < high), 
    round(x.num, digits = digits), 
    prettyNum(x.num, digits=digits, scientific = scipen, ...)
  )
}
reg = paste0("([0-9.\\-]+", mark, "[0-9.\\-]+)")
cat(gsubfn(reg, ~replace_numbers(x), star), sep='\n')

上述代码首先将系数中的小数点替换为唯一标识符"::::",然后通过正则表达式搜索匹配该标识符的数字,并使用replace_numbers函数将其替换为科学计数法形式的数字。

如果想要保留科学计数法中的尾部零,则可以使用sprintf替代prettyNum。以下是使用sprintf实现的替换函数的代码:

replace_numbers = function(x, low=0.01, high=1e3, digits = 3) {
  x = gsub(mark,'.',x)
  x.num = as.numeric(x)
  form = paste0('%.', digits, 'e')
  ifelse(
    (abs(x.num) >= low) & (abs(x.num) < high), 
    round(x.num, digits = digits), 
    sprintf(form, x.num) 
  )
}

这段代码与之前的代码类似,只是在替换函数中使用了sprintf函数来保留尾部零。

通过修改stargazer的参数和使用正则表达式搜索和替换的方法,我们可以将系数以科学计数法的形式显示出来。这对于需要以科学计数法来呈现系数的数据分析和学术写作非常有用。

0
0 Comments

如何使用stargazer在科学计数法中显示系数?

在stargazer包中,当前没有提供直接在科学计数法中显示系数的选项。因此,我们可以向包维护者提出该功能请求。但在此之前,我们可以使用一些方法来自动将输出中的数字替换为科学计数法。在替换数字时,需要注意一些问题。首先,重要的是不要重新格式化作为latex编码一部分的数字。此外,还要注意不要替换变量名中的字符。例如,.Sepal.Width中可能会被正则表达式错误地视为数字。下面的代码可以处理大多数常见情况。但是,如果有人将其变量命名为X_123456789,根据scipen设置,它可能会将其重命名为X_1.23e+09。因此,需要谨慎处理,并且可能需要在stargazer包内实施一个更健壮的解决方案。

下面是一个示例stargazer表格,用以演示该方法:

library(stargazer)
library(gsubfn)
m1 <- lm(Sepal.Length ~ Petal.Length*Sepal.Width,
  transform(iris, Sepal.Length = Sepal.Length+1e6,
    Petal.Length=Petal.Length*10, Sepal.Width=Sepal.Width*100))    
star = stargazer(m1, header = F, digit.separator = '')

现在,我们定义一个辅助函数来重新格式化数字。您可以通过调整digits和scipen参数来控制输出格式。如果要更频繁地使用科学计数法,请使用较小(更负)的scipen。否则,我们可以通过使用较大的scipen仅对非常小或非常大的数字自动使用科学计数法。cutoff参数用于防止重新格式化仅由少数字符表示的数字。

replace_numbers = function(x, cutoff=4, digits=3, scipen=-7) {
  ifelse(nchar(x) < cutoff, x, prettyNum(as.numeric(x), digits=digits, scientific=scipen))
}

然后,我们可以使用gsubfn::gsubfn将该函数应用到stargazer的输出上:

gsubfn("([0-9.]+)", ~replace_numbers(x), star)

问题是,当前的答案并不能完全满足科学计数法的要求,即X.Ye+(Z)。上述输出显示了这个问题,你明白我的意思吗?

我不太明白您的意思。您是指希望结果显示为例如1.5 x 10$^3$而不是1.5e+03吗?

不,我的意思是,1e+06应该是1.2e+06或者其他。小数部分应该保持一致。例如,您不希望下一行显示为8.44e-01和8.4e-01。而是希望显示为8.44e-01和8.40e-01(如果是这样的话)。(上述的R^2示例)

好的,我明白了。我编辑了获得悬赏的答案,使用了sprintf而不是prettyNum。这样可以始终以科学计数法显示相同数量的数字(保留任何尾随的零)。如果需要,也可以将相同的更改应用到此版本中。

0
0 Comments

如何使用stargazer在科学记数法中显示系数

问题的原因是stargazer包不直接支持在科学记数法中显示系数。但是可以尝试使用其他替代方案,如xtable包或pander包。

解决方法之一是使用xtable包。可以使用display参数将系数显示为科学记数法。

另一个解决方法是使用pander包,该包已经自动支持科学记数法。可以使用pander函数将系数显示为科学记数法。

如果使用knitr或pandoc,还可以将结果输出为markdown格式,然后再转换为latex/pdf格式。

对于pglm模型,没有直接支持的包。可以尝试将pglm模型转换为数据框格式,然后使用其他包生成latex格式。

要在科学记数法中显示系数,可以尝试使用xtable包的display参数或pander包的pander函数。对于pglm模型,需要将其转换为数据框格式后再进行处理。

0