【问题标题】:Repeat loop 100 times adding regression lines to same plot for each iteration重复循环 100 次,为每次迭代将回归线添加到同一图
【发布时间】:2019-11-28 04:28:35
【问题描述】:

我有一个while 循环,它需要重复采样过程,直到样本列value 的值小于列rep1:rep4。我想重复这个循环一定次数,比如说 100 次。

对于每个成功的循环,我想将回归线添加到两个单独的图中。在此示例中,value 列将为 x 轴提供数据,而 y 轴的数据将来自y1y2。我已经包含了额外的 y 列,因为可能有许多我想绘制的变量都将共享相同的 x 轴数据。对于此示例,最终结果将是两个图,一个用于y1,一个用于y2,每个包含 100 条重叠回归线。

我没有在这里包含采样过程代码,因为它有点过于复杂,可能会分散这里的主要问题。

下面提供了基本的while 循环和示例数据。

此线程Use a for-loop of characters to plot several lines with specific colors 表示带有seq_along 的附加for 循环可能是这里的答案。然而,不同的颜色对我来说不是问题,所以这个例子可能比这里需要的更复杂。

for (i in 1:nrow(df)){
  while (any(df$value[i]<=as.numeric(df[i,2:5])%>%na.omit())){

#sampling procedure here

}
}  

这是df 布局的示例:


    ID    rep1   rep2   rep3   rep4  y1  y2  value
1   a     NA     NA     NA     NA    5   2   -400
2   b     -400   NA     NA     NA    7   5   -300
3   c     -400   -300   NA     NA    3   3   -200
4   d     -400   -300   -200   NA    4   6   -300
5   e     -400   -300   -200   -300  9   7   -400
6   f     NA     NA     NA     NA    2   3   -400
7   g     -400   NA     NA     NA    3   2   -400
8   h     NA     NA     NA     NA    6   4   -400
9   i     NA     NA     NA     NA    7   4   -200
10  j     -200   -300   NA     NA    7   6   -300
11  k     -300   NA     NA     NA    8   9   -200
12  l     NA     NA     NA     NA    3   7   -300
13  m     NA     NA     NA     NA    4   7   -300
structure(list(ID = structure(1:13, .Label = c("a", "b", "c", 
"d", "e", "f", "g", "h", "i", "j", "k", "l", "m"), class = "factor"), 
    rep1 = c(NA, -400L, -400L, -400L, -400L, NA, -400L, NA, NA, 
    -200L, -300L, NA, NA), rep2 = c(NA, NA, -300L, -300L, -300L, 
    NA, NA, NA, NA, -300L, NA, NA, NA), rep3 = c(NA, NA, NA, 
    -200L, -200L, NA, NA, NA, NA, NA, NA, NA, NA), rep4 = c(NA, 
    NA, NA, NA, -300L, NA, NA, NA, NA, NA, NA, NA, NA), y1 = c(5L, 
    7L, 3L, 4L, 9L, 2L, 3L, 6L, 7L, 7L, 8L, 3L, 4L), y2 = c(2L, 
    5L, 3L, 6L, 7L, 3L, 2L, 4L, 4L, 6L, 9L, 7L, 7L), value = c(-400L, 
    -300L, -200L, -300L, -400L, -400L, -400L, -400L, -200L, -300L, 
    -200L, -300L, -300L)), class = "data.frame", row.names = c(NA, 
-13L))

我想这应该适用于基本情节

ggplot(data = df, aes(x = value, y = y1)) +
  geom_smooth(method = lm, se = FALSE)
ggplot(data = df, aes(x = value, y = y2)) +
  geom_smooth(method = lm, se = FALSE)

【问题讨论】:

  • 每次迭代用lm() 拟合回归线不是更容易吗(因为这是geom_smooth(method = lm) 所做的),然后在data.frame 中总结必要的系数,然后绘制一次所有的行?
  • @teunbrand 我认为不会使用简单的线性回归,而是使用类似黄土的东西。 lm() 函数会为此工作吗?不过,沿着这些思路,由于 y 值没有改变,而不是记录截距数据,也许将value 数据记录在data.frame 中然后根据需要绘制会更容易?如果是这种情况,应该如何设置外部for 循环以将单个运行记录在单独的data.frame 中?如果将运行次数增加到一千次,该技术是否会变得比仅绘制数据更麻烦?

标签: r loops for-loop ggplot2


【解决方案1】:

让我们假设您的抽样程序按预期工作,并且目标只是跟踪来自while 循环的数据帧并使用geom_smooth 绘制它(如果我有误解,请澄清)。您可以将感兴趣的变量保存到数据框中,包括一个 ID 以跟踪每个数据框,然后在绘图时按这些 ID 分组。下面我使用的是你提供的数据。

library(tidyverse)
set.seed(4)

#an empty data frame to save our output
toplot <- data.frame(ID = NA, value = NA, y1 = NA, y2 = NA)

#loop for 50 times for this example
for(i in 1:50){

  #sampling the df. This would be your while loop. 
  #Just save your output from the while loop as an data frame object
  d1 <- sample_n(df, 5)

  #save the values of interest
  toplot_TMP <- data.frame(value = d1$value, y1 = d1$y1, y2 = d1$y2)

  #create ID variable
  toplot_TMP$ID <- i

  #bind to our data frame for later
  toplot <- bind_rows(toplot,toplot_TMP)

 }

#drop NA artifact
toplot <- na.omit(toplot)

#plotting with group = ID
ggplot(data = toplot, aes(x = value, y = y1, group = ID)) +
  geom_smooth(method = lm, se = FALSE)

随心所欲。

【讨论】:

  • 这让我越过了我一直打的墙。谢谢你。 toplot 数据框将是一个野兽,但它可以获取我需要记录、组织和可视化的所有数据。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2011-11-20
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多