稀疏函数数据图

Sparse Functional Data Plot

我想知道如何使用 R 重现下图。

图中使用的数据是骨密度的稀疏函数数据。基本上每个参与者的骨矿物质水平在实验过程中都会被观察几次。但是每个参与者的观察次数和观察次数是不同的。

图来自文章'Principal component models for sparse functional data'。 你可以在这里找到它 Principal component models for sparse functional data or Principal component models for sparse functional data

您可以使用 made-up 数据重现该图,如下所示:

library(ggplot2)

# Create sample data
set.seed(8) # Makes data reproducible
ages <- runif(40, 8, 24)
df <- do.call(rbind, lapply(seq_along(ages), function(x) {
  age <- ages[x] + cumsum(runif(sample(2:5, 1), 1, 2))
  y <- (tanh((age - 10)/pi - pi/2) + 2.5)/3
  y <- y + rnorm(1, 0, 0.1)
  y <- y + cumsum(rnorm(length(y), 0, 0.02))
  data.frame(ID = x, age = age, BMD = y)
}))

# Draw plot
ggplot(df, aes(x = age, y = BMD)) +
  geom_path(aes(group = ID), color = 'gray70', na.rm = TRUE) +
  geom_point(color = 'gray70', na.rm = TRUE) +
  geom_smooth(color = 'black', se = FALSE, formula =y ~ s(x, bs = "cs"), 
              method = 'gam', na.rm = TRUE) +
  theme_classic(base_size = 16) +
  scale_x_continuous(limits = c(8, 28)) +
  labs(y = 'Spinal Bone Density', x = 'Age') +
  theme(panel.border = element_rect(fill = NA))

然而,在不了解您自己的数据结构的情况下,很难说您会发现它对您自己的用例有多适用。

你可以在 ggplot2 中执行此操作,只要你有 长格式 的数据并且使用分组变量,例如我的示例中的 id

dat <- tibble::tribble(
               ~id, ~age, ~bone_dens,
                1,   10,   0.6,
                1,   15,   0.8,
                1,   19,   1.12,
                2,   11,   0.7,
                2,   18,   1.1,
                3,   16,   1.1,
                3,   18,   1.2,
                3,   25,   1.0)

您首先使用 geom_point() 绘制点,然后添加使用 geom_line():

连接具有相同 ID 的点的线
dat |>
    ggplot(aes(x = age, y = bone_dens)) +
    geom_point() +
    geom_line(aes(group = id))

输出将如下所示 - 您可以像自定义任何其他 ggplot 一样对其进行自定义。