推断具有有限数据点的数据集并将所有值添加到新数据集

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 有一个 xy;

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()