稀疏函数数据图
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 一样对其进行自定义。
我想知道如何使用 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()
:
dat |>
ggplot(aes(x = age, y = bone_dens)) +
geom_point() +
geom_line(aes(group = id))
输出将如下所示 - 您可以像自定义任何其他 ggplot 一样对其进行自定义。