推断具有有限数据点的数据集并将所有值添加到新数据集
Extrapolate dataset with limited data points and add all values to new dataset
我有一个数据点非常有限的数据集。
x<- c(4, 8, 13, 24)
y<- c(40, 37, 28, 20)
df<- data.frame(x,y)
现在我想推断这些数据,创建一个数据集,其中将为 1-100 之间的 x 的每个值(无小数)给出 y 的值。 x和y有线性关系。
其次,是否可以通过使用循环之类的方法对多个数据帧完成此操作?
谢谢!
这是执行此操作的简短代码段:
linear_xy <- lm(y ~ x, data = df)
# df <- broom:::augment.lm(linear_xy, newdata = complete(df, x = 1:100)) # one way
df <- df %>% # another way
complete(x = 1:100) %>%
mutate(.fitted = predict(linear_xy, newdata = .))
ggplot(df, aes(x, y)) +
geom_line(aes(y = .fitted)) +
geom_point() +
ggpubr::theme_pubr()
这需要您安装软件包 {tidyverse}
、{broom}
和 {ggpubr}
。
第二部分
假设我们想用多个 data-frames 来做到这一点,我们必须
稍微重组一下。
x <- c(4, 8, 13, 24)
y <- c(40, 37, 28, 20)
df <- tibble(x, y)
我没有多个 data-frames(或小标题),所以我将其设为
主要的,并组成一个函数(一个工厂),它产生 data-frames,与上面的 df
.
有点不同
df_factory <- . %>%
mutate(x_new = x + sample.int(100, size = n()),
x = if_else(x_new >= 100, x, x_new),
y_new = y + rnorm(n(), mean = median(y), sd = sd(y)),
y = y_new,
y_new = NULL,
x_new = NULL)
因此 df_factory
是 one-variable 的一个函数,它必须是一个
data-frame 有一个 x
和 y
;
df1 <- df_factory(df)
df2 <- df_factory(df)
df3 <- df_factory(df)
all_dfs <- list(df1, df2, df3)
all_dfs <- bind_rows(all_dfs, .id = "df_id")
这里我们确保通过新变量 df_id
.
在 all_dfs
data-frame 中保留与原始 data-frame 的关系
接下来我们要:
- 将变量折叠成它们的个体 data-frame,然后我们把
在名为
data
. 的 list-column 中
- 对于每个(参见
rowwise
),我们必须执行:
- 一个“插值”线性模型(不是 piece-wise 所以...)
- 对每个
linear_xy
进行预测(它们也存储在 list-column` 中)。
- 将其全部取消嵌套,因此可以将其作为一个连续的 data-frame.
送入 ggplot
all_dfs %>%
nest(data = c(x,y)) %>%
rowwise() %>%
mutate(linear_xy = list(lm(y ~ x, data = data)),
augment = list(broom:::augment.lm(linear_xy,
newdata = complete(data, x = 1:100)))) %>%
ungroup() %>%
select(-data, -linear_xy) %>%
unnest(augment) ->
all_dfs_predictions
注意:最后的 ->
显示管道结果现在分配给什么。
group
通知 ggplot
将行视为单独的行
df_id
。为了好玩,我们添加颜色和填充也取决于 df_id
。事实上,我本可以选择其他东西作为 color
美学依赖,比如“原始 df
” 与“其他”,或者如果某个阈值应该区分它们,等等。但是 group
审美仍然会告诉 ggplot
在这种关系中分隔行。
ggplot(all_dfs_predictions, aes(x, y, group = df_id, color = df_id, fill = df_id)) +
geom_line(aes(y = .fitted)) +
geom_point() +
lims(x = c(1,100)) +
ggpubr::theme_pubr()
我有一个数据点非常有限的数据集。
x<- c(4, 8, 13, 24)
y<- c(40, 37, 28, 20)
df<- data.frame(x,y)
现在我想推断这些数据,创建一个数据集,其中将为 1-100 之间的 x 的每个值(无小数)给出 y 的值。 x和y有线性关系。
其次,是否可以通过使用循环之类的方法对多个数据帧完成此操作? 谢谢!
这是执行此操作的简短代码段:
linear_xy <- lm(y ~ x, data = df)
# df <- broom:::augment.lm(linear_xy, newdata = complete(df, x = 1:100)) # one way
df <- df %>% # another way
complete(x = 1:100) %>%
mutate(.fitted = predict(linear_xy, newdata = .))
ggplot(df, aes(x, y)) +
geom_line(aes(y = .fitted)) +
geom_point() +
ggpubr::theme_pubr()
这需要您安装软件包 {tidyverse}
、{broom}
和 {ggpubr}
。
第二部分
假设我们想用多个 data-frames 来做到这一点,我们必须 稍微重组一下。
x <- c(4, 8, 13, 24)
y <- c(40, 37, 28, 20)
df <- tibble(x, y)
我没有多个 data-frames(或小标题),所以我将其设为
主要的,并组成一个函数(一个工厂),它产生 data-frames,与上面的 df
.
df_factory <- . %>%
mutate(x_new = x + sample.int(100, size = n()),
x = if_else(x_new >= 100, x, x_new),
y_new = y + rnorm(n(), mean = median(y), sd = sd(y)),
y = y_new,
y_new = NULL,
x_new = NULL)
因此 df_factory
是 one-variable 的一个函数,它必须是一个
data-frame 有一个 x
和 y
;
df1 <- df_factory(df)
df2 <- df_factory(df)
df3 <- df_factory(df)
all_dfs <- list(df1, df2, df3)
all_dfs <- bind_rows(all_dfs, .id = "df_id")
这里我们确保通过新变量 df_id
.
all_dfs
data-frame 中保留与原始 data-frame 的关系
接下来我们要:
- 将变量折叠成它们的个体 data-frame,然后我们把
在名为
data
. 的 list-column 中
- 对于每个(参见
rowwise
),我们必须执行:- 一个“插值”线性模型(不是 piece-wise 所以...)
- 对每个
linear_xy
进行预测(它们也存储在 list-column` 中)。
- 将其全部取消嵌套,因此可以将其作为一个连续的 data-frame. 送入
ggplot
all_dfs %>%
nest(data = c(x,y)) %>%
rowwise() %>%
mutate(linear_xy = list(lm(y ~ x, data = data)),
augment = list(broom:::augment.lm(linear_xy,
newdata = complete(data, x = 1:100)))) %>%
ungroup() %>%
select(-data, -linear_xy) %>%
unnest(augment) ->
all_dfs_predictions
注意:最后的 ->
显示管道结果现在分配给什么。
group
通知 ggplot
将行视为单独的行
df_id
。为了好玩,我们添加颜色和填充也取决于 df_id
。事实上,我本可以选择其他东西作为 color
美学依赖,比如“原始 df
” 与“其他”,或者如果某个阈值应该区分它们,等等。但是 group
审美仍然会告诉 ggplot
在这种关系中分隔行。
ggplot(all_dfs_predictions, aes(x, y, group = df_id, color = df_id, fill = df_id)) +
geom_line(aes(y = .fitted)) +
geom_point() +
lims(x = c(1,100)) +
ggpubr::theme_pubr()