首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用天文望远镜显示科学符号中的系数

如何用天文望远镜显示科学符号中的系数
EN

Stack Overflow用户
提问于 2015-07-22 00:20:28
回答 3查看 5.2K关注 0票数 12

我想比较不同的模型(lm,glm,plm,pglm)在R表中的结果。但是,我找不到一种方法来显示科学符号中的系数。这是一个问题,因为截距相当大(大约一百万),而其他系数很小(大约e-7),这会导致大量无用的零,使得很难读取表。

我在这里发现了一个类似的问题:Format model display in texreg or stargazer R as scientific。但是那里的结果需要重新调整变量的标度,因为我使用了计数数据,所以我不想重放它。

我很感谢各位提出的建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-22 05:08:17

下面是一个可重复的例子:

代码语言:javascript
复制
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对此有很好的支持。您可以尝试其他替代方案,如xtableany of the many options here (我还没有全部尝试)。

代码语言:javascript
复制
library(xtable)
xtable(m1, display=rep('g', 5)) # or there's `digits` too; see `?xtable`

或者,如果您使用的是knitrpandoc I,您非常喜欢pander,它已经具有自动科学表示法(注意:这是pandoc输出,它看起来像markdown,而不是tex输出,然后您将其编织到pander/pdf中):

代码语言:javascript
复制
library(pander)
pander(m1)
票数 5
EN

Stack Overflow用户

发布于 2019-07-04 17:18:45

可能值得向包维护人员提出包含此选项的特性请求。

同时,你可以用科学符号自动地替换输出中的数字.在替换数字时,有几件事要小心。重要的是不要重新格式化数字,因为它是乳胶编码的一部分。另外,不要替换变量名称中的部分字符。例如,. in Sepal.Width很容易被正则表达式误认为是数字。下面的代码应该处理大多数常见的情况。但是,如果有人,例如,调用他们的变量X_123456789,它可能会将它重命名为X_1.23e+09,这取决于scipen设置。因此,我们需要谨慎一些,并且可能需要在观星者方案中实施更有力的解决方案。

下面是一个要演示的星空表示例(无耻地从@mathematical.coffee复制):

代码语言:javascript
复制
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参数的存在是为了防止仅用几个字符表示的数字重新格式化。

代码语言:javascript
复制
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将其应用于天文望远镜的输出。

代码语言:javascript
复制
gsubfn("([0-9.]+)", ~replace_numbers(x), star)

票数 4
EN

Stack Overflow用户

发布于 2019-07-07 17:13:58

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

使用来自m1的示例模型this other answer

代码语言:javascript
复制
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。

像这样

代码语言:javascript
复制
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) 
  )
}

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31551822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档