我想比较不同的模型(lm,glm,plm,pglm)在R表中的结果。但是,我找不到一种方法来显示科学符号中的系数。这是一个问题,因为截距相当大(大约一百万),而其他系数很小(大约e-7),这会导致大量无用的零,使得很难读取表。
我在这里发现了一个类似的问题:Format model display in texreg or stargazer R as scientific。但是那里的结果需要重新调整变量的标度,因为我使用了计数数据,所以我不想重放它。
我很感谢各位提出的建议。
发布于 2015-07-22 05:08:17
下面是一个可重复的例子:
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))
# Coefficients:
# (Intercept) Petal.Length Sepal.Width Petal.Length:Sepal.Width
# 1.000e+06 7.185e-02 8.500e-03 -7.701e-05 我不相信stargazer对此有很好的支持。您可以尝试其他替代方案,如xtable或any of the many options here (我还没有全部尝试)。
library(xtable)
xtable(m1, display=rep('g', 5)) # or there's `digits` too; see `?xtable`或者,如果您使用的是knitr或pandoc I,您非常喜欢pander,它已经具有自动科学表示法(注意:这是pandoc输出,它看起来像markdown,而不是tex输出,然后您将其编织到pander/pdf中):
library(pander)
pander(m1)发布于 2019-07-04 17:18:45
可能值得向包维护人员提出包含此选项的特性请求。
同时,你可以用科学符号自动地替换输出中的数字.在替换数字时,有几件事要小心。重要的是不要重新格式化数字,因为它是乳胶编码的一部分。另外,不要替换变量名称中的部分字符。例如,. in Sepal.Width很容易被正则表达式误认为是数字。下面的代码应该处理大多数常见的情况。但是,如果有人,例如,调用他们的变量X_123456789,它可能会将它重命名为X_1.23e+09,这取决于scipen设置。因此,我们需要谨慎一些,并且可能需要在观星者方案中实施更有力的解决方案。
下面是一个要演示的星空表示例(无耻地从@mathematical.coffee复制):
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 = '')现在是一个帮助函数来重新格式化数字。您可以使用数字和枕木参数来控制输出格式。如果你想强迫科学格式更经常使用更小(更消极)的枕木。否则,通过使用更大的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将其应用于天文望远镜的输出。
gsubfn("([0-9.]+)", ~replace_numbers(x), star)

发布于 2019-07-07 17:13:58
另一种使用天文望远镜获得科学符号的可靠方法是黑入digit.separator参数。此选项允许用户指定分隔小数的字符(在大多数区域中通常是句点. )。我们可以篡夺这个参数,将一个唯一可识别的字符串插入到我们希望使用regex能够找到的任何数字中。这样搜索数字的好处是,我们只能在星体输出中找到与数值相对应的数字。也就是说,不可能还匹配作为变量名称(例如X_12345)的一部分或作为乳胶格式代码的一部分的数字(例如\hline \\[-1.8ex])。在下面,我使用字符串::::,但是表中其他地方找不到的任何唯一字符串(例如散列)都可以。最好避免在标识符标记中使用任何特殊的regex字符,因为这会使事情稍微复杂化。
使用来自m1的示例模型this other answer。
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')

如果要确保在科学表示法中保留尾随零,则可以使用更新而不是prettyNum。
像这样
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)
)
}

https://stackoverflow.com/questions/31551822
复制相似问题