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

Lau*_*old 0 r dataset extrapolation

我有一个数据点非常有限的数据集。

 x<- c(4, 8, 13, 24)
 y<- c(40, 37, 28, 20)
 df<- data.frame(x,y)
Run Code Online (Sandbox Code Playgroud)

现在我想推断这些数据,创建一个数据集,其中 y 的值将为 1-100 之间的 x 的每个值(无小数)给出。x 和 y 具有线性关系。

其次,可以通过使用循环之类的东西来对多个数据帧完成此操作吗?谢谢你!

Mos*_*ssa 5

这是执行此操作的一个简短片段:

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()
Run Code Online (Sandbox Code Playgroud)

这要求您安装了软件包{tidyverse}{broom}{ggpubr}

第二部分

假设我们想用多个数据帧来做到这一点,我们必须稍微重组一下。

x <- c(4, 8, 13, 24)
y <- c(40, 37, 28, 20)
df <- tibble(x, y)
Run Code Online (Sandbox Code Playgroud)

我没有多个数据帧(或小标题),所以我将把它作为主要数据帧,并组成一个生成数据帧的函数(工厂),这与上面的有点不同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)
Run Code Online (Sandbox Code Playgroud)

因此df_factory是一个单变量函数,并且必须是一个具有xand 的数据框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")
Run Code Online (Sandbox Code Playgroud)

all_dfs在这里,我们确保通过新变量将与原始数据帧的关系保留在数据帧中df_id

接下来我们想要:

  • 将变量折叠到各自的数据框中,然后将其放入名为 的列表列中data
  • 对于每个(参见rowwise)我们必须执行:
    • 一种“插值”线性模型(不是分段模型,所以......)
    • 对其中每一个进行预测linear_xy(也存储在列表列中)。
  • 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
Run Code Online (Sandbox Code Playgroud)

注意:->最后显示了管道结果现在分配给的内容。

通过它们的通知将行视为单独 group的。为了好玩,我们添加颜色和填充也取决于。事实上,我可以选择其他一些与美学相关的东西,比如“原创”与“其他”,或者是否某个阈值应该区分它们,等等。但是美学仍然会告诉我们在这种关系中分隔行。ggplotdf_iddf_idcolordfgroupggplot

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()
Run Code Online (Sandbox Code Playgroud)

生成的 ggplot2-plot