You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

modelsummary输出中极小p值显示异常的配置求助

问题:modelsummary表格中极小p值的显示配置问题

在对比4个回归分析结果并使用modelsummary包制表时,部分p值极小(如2e-28),本质趋近于0,但表格中仅显示“p =”而非“p = 0”。现有代码如下:

# Linear models summary - Stateline, Garland, Benban, Bungala

library(tidyverse)
library(rstatix)
# For tables
library(modelsummary)
library(kableExtra)
library(gt)

[Import data from CSVs]

# Processing and presenting models
# Info from https://vincentarelbundock.github.io/modelsummary/articles/modelsummary.html

# Define models

models <- list(
  "Stateline"     = lm(mean ~ 0 + buffer + Month + JulianDay + TimePeriod, data = stateline_data),
  "Garland"     = lm(mean ~ 0 +buffer + Month + JulianDay + TimePeriod, data = garland_data),
  "Benban"     = lm(mean ~ 0 + buffer + JulianDay + TimePeriod, data = benban_data),
  "Bungala"     = lm(mean ~ 0 + buffer + JulianDay + TimePeriod, data = bungala_data))

modelsummary(models,
             estimate = "{estimate}{stars}",
             statistic = c("conf.int",
                           "s.e. = {std.error}",
                           "t = {statistic}",
                           "p = {p.value}"), 
             fmt = 4,
             coef_rename = c("buffer" = "Buffer", "JulianDay" = "Julian Day", "TimePeriod2" = "Post-Construction"))

希望实现以下两种效果之一:

  1. 将极小p值显示为0
  2. 仅对p值使用科学计数法,其他数据保持原格式

解决方案

方案1:将极小p值显示为0

通过自定义格式化函数,对小于设定阈值(如1e-4)的p值直接显示为0,其余p值保留4位小数:

# 自定义p值格式化函数
format_p <- function(x) {
  ifelse(x < 1e-4, 0, sprintf("%.4f", x))
}

modelsummary(models,
             estimate = "{estimate}{stars}",
             statistic = c("conf.int",
                           "s.e. = {std.error}",
                           "t = {statistic}",
                           "p = {p.value}"), 
             fmt = list(estimate = 4, std.error = 4, statistic = 4, p.value = format_p),
             coef_rename = c("buffer" = "Buffer", "JulianDay" = "Julian Day", "TimePeriod2" = "Post-Construction"))

方案2:仅对p值使用科学计数法

自定义函数实现:极小p值用科学计数法显示,常规p值保留4位小数,其他统计量维持原格式:

# 自定义p值科学计数法格式化函数
format_p_sci <- function(x) {
  ifelse(x < 1e-4, sprintf("%.2e", x), sprintf("%.4f", x))
}

modelsummary(models,
             estimate = "{estimate}{stars}",
             statistic = c("conf.int",
                           "s.e. = {std.error}",
                           "t = {statistic}",
                           "p = {p.value}"), 
             fmt = list(estimate = 4, std.error = 4, statistic = 4, p.value = format_p_sci),
             coef_rename = c("buffer" = "Buffer", "JulianDay" = "Julian Day", "TimePeriod2" = "Post-Construction"))

关键说明

  • fmt参数支持传入列表,为不同统计量指定独立格式化规则,实现仅调整p值显示、不影响其他数据的效果。
  • 可根据需求修改阈值(如将1e-4改为1e-5)或科学计数法的小数位数(如%.2e改为%.1e)。

内容的提问来源于stack exchange,提问作者strangecharm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:25:34