关于#r语言#的问题:绘制uni森林图报错

绘制uni森林图报错,提示

Error in check_errors(data = data, est = est, lower = lower, upper = upper,  : 
  Sizes must be larger than 0.

我的数据

img


我的代码

library(tidyverse)
pu <-
  forest(data1[,c(5:8)],
         est = as.numeric(data1$HR), 
         lower = as.numeric(data1$lowerCI),
         upper = as.numeric(data1$upperCI),
         sizes = as.numeric(data1$se),
         ci_column = 3, 
         ref_line = 1,
         arrow_lab = c("Placebo Better", "Treatment Better"),
         xlim = c(0, 20),
         ticks_at = c(0,4,8,12,16)
  )

到底哪里出了问题呢

基于Monster 组和GPT的调写:
错误提示表明你传递给 forest 函数的数据中有一些列或行的大小为零。

img


这一行是0

参考GPT和自己的思路,根据报错信息,看起来出错是因为在函数中传入了一个大小小于或等于0的变量。根据你提供的代码,可以发现在 forest 函数中传入了一个名为 sizes 的变量,该变量是一个向量,应该包含每个点的大小,而且应该是大于0的数值。

你可以检查一下 data1$se 向量是否包含大小小于或等于0的元素,如果包含,则需要将其过滤掉或将其替换为大于0的值。下面是一种可能的解决方法:

# 过滤掉大小小于等于0的元素
data1 <- data1[data1$se > 0, ]

# 将 data1$se 中小于等于0的值替换为一个很小的正数
data1$se[data1$se <= 0] <- 1e-10

# 使用修改后的 data1$se 变量调用 forest 函数
pu <- forest(data1[,c(5:8)],
         est = as.numeric(data1$HR), 
         lower = as.numeric(data1$lowerCI),
         upper = as.numeric(data1$upperCI),
         sizes = as.numeric(data1$se),
         ci_column = 3, 
         ref_line = 1,
         arrow_lab = c("Placebo Better", "Treatment Better"),
         xlim = c(0, 20),
         ticks_at = c(0,4,8,12,16)
  )

这将过滤掉大小小于等于0的元素,并将大小小于等于0的元素替换为一个很小的正数,以确保 sizes 变量中不会包含大小小于等于0的元素。

该回答引用ChatGPT

根据错误提示,似乎是在执行forest()函数时出现了一个问题,Sizes must be larger than 0.说明所传入的sizes参数的值必须大于0。

在这种情况下,建议检查一下数据中sizes列的值是否都大于0,可以使用summary()函数来查看sizes列的一些摘要统计量,例如:

summary(data1$sizes)

如果sizes列中存在值为0或者缺失值,可以通过排除或替换这些值来解决该问题,例如:


pu <-
  forest(data1 %>% filter(sizes > 0), # 只选择sizes > 0的行
         est = as.numeric(data1$HR), 
         lower = as.numeric(data1$lowerCI),
         upper = as.numeric(data1$upperCI),
         sizes = as.numeric(data1$se),
         ci_column = 3, 
         ref_line = 1,
         arrow_lab = c("Placebo Better", "Treatment Better"),
         xlim = c(0, 20),
         ticks_at = c(0,4,8,12,16)
  )

或者将sizes中的0替换为一个较小的正数,例如:


data1$sizes[data1$sizes == 0] <- 0.1 # 将0替换为0.1
pu <-
  forest(data1[,c(5:8)],
         est = as.numeric(data1$HR), 
         lower = as.numeric(data1$lowerCI),
         upper = as.numeric(data1$upperCI),
         sizes = as.numeric(data1$se),
         ci_column = 3, 
         ref_line = 1,
         arrow_lab = c("Placebo Better", "Treatment Better"),
         xlim = c(0, 20),
         ticks_at = c(0,4,8,12,16)
  )