基于 R 中 ccf 值输出的象限图

Quadrant plot based on ccf value outputs in R

我正在尝试绘制物种敏感性和放电响应速度图。我需要最大滞后位置作为 x 值,该滞后位置的相关性作为 y 值。

我有这个示例数据...

structure(list(Date = structure(c(16222, 16617, 14518, 15156, 
15918, 17075, 15522, 16679, 16010, 15187, 15461, 16283, 17379, 
15553, 17410, 15553, 16191, 16314, 14549, 15979), class = "Date"), 
    Commonname = c("Black Sea Bass", "Pinfish", "Pigfish", "Pinfish", 
    "Silver Perch", "Black Sea Bass", "Pigfish", "Pinfish", "Pigfish", 
    "Silver Perch", "Silver Perch", "Black Sea Bass", "Pinfish", 
    "Pinfish", "Silver Perch", "Pigfish", "Black Sea Bass", "Silver Perch", 
    "Silver Perch", "Black Sea Bass"), CPUE = c(1.25513090974505, 
    9.41478783154444, 1.63667465565289, 3.13779141143018, 4.26313144106683, 
    2.32564938844104, 2.70394855189782, 8.49969670589948, 1.7329255861366, 
    2.0845409179642, 0.269832703723692, 1.21288437532366, 11.8739506505966, 
    8.55504246458105, 2.21256794002004, 4.51336797979511, 1.47695928524315, 
    1.10425042966867, 0.632732705722451, 1.59167844861806), Discharge = c(14.8521616, 
    5.23042759111111, 1.42663083211115, 0.184551018105263, 48.9156538971429, 
    2.29765846588235, 33.25524992, 4.06629248, 1.610659584, 0.21166808, 
    0.0607489749333333, 2.22029454545455, 12.90821328, 31.9696672, 
    8.05754544, 32.7267690105263, 43.493472128, 6.77337856, 1.10646621744, 
    4.37803470545454)), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

我正在使用此代码绘制所有 ccf 函数...

df.split <- split(df, df$Commonname, drop = TRUE)
par(mfrow=c(3,4))
lapply(seq_along(df.split), function(x) ccf(df.split[[x]]$CPUE,df.split[[x]]$Discharge, lag.max = 5,
                                              ylab = "", xlab = "", main= names(df.split)[x]))


但是需要提取每个物种的这些值并将它们放入向量中,这样我就可以将它们绘制在某种分位数图上。

我理想的输出是一个 x 轴为 0-5 或任何我认为 lag.max 的图(在其 5 上方的代码中)。 y 轴将从 -1 到 1(除非 0 到 1 与相关的绝对值更有意义)。

上面的代码在控制台中输出值并绘制拆分中包含的所有物种的 ccf 函数,但我有 ~130 个物种,手动填写值太繁琐了。

所以它看起来像这样......每个物种都有一个点。将标有物种名称。作为奖励,名称中的 * 是滞后相关值 (y) 很重要。同样,x 值将是具有最高相关性的滞后。

亲爱的@Johnny5ish 我会尽力帮助你。但是,一开始我不得不承认我不知道 ccf 函数是什么,它有什么作用 return。尽管如此,我相信我能够向您展示如何完成这项任务。

让我们从 df 变量中的数据开始。 我将所有内容分为 4 个简单的步骤。我会依次描述他们给的是什么。

library(tidyverse)

fccf = function(data) ccf(data$CPUE,data$Discharge, lag.max = 5, plot = FALSE)
facf = function(acf) tibble(aacf = acf$acf[,,1], lag = acf$lag[,,1])

df %>% group_by(Commonname) %>%
  nest() %>%  #Step 1
  mutate(ccf = map(data, ~fccf(.x))) %>% #Step 2
  mutate(acf = map(ccf, ~facf(.x))) %>%  #Step 3
  unnest(acf) %>%  #Step 4
  ggplot(aes(lag, aacf, fill=Commonname, color=Commonname))+
  geom_point()

第一步。 我将变量 Commonname 的数据分组并用函数 nest.

折叠它
# A tibble: 4 x 2
# Groups:   Commonname [4]
  Commonname     data            
  <chr>          <list>          
1 Black Sea Bass <tibble [5 x 3]>
2 Pinfish        <tibble [5 x 3]>
3 Pigfish        <tibble [4 x 3]>
4 Silver Perch   <tibble [6 x 3]>

步骤。 2个 我正在使用一个简单的 fccf 函数,它将 return ccf 函数的结果赋给同名变量。

# A tibble: 4 x 3
# Groups:   Commonname [4]
  Commonname     data             ccf   
  <chr>          <list>           <list>
1 Black Sea Bass <tibble [5 x 3]> <acf> 
2 Pinfish        <tibble [5 x 3]> <acf> 
3 Pigfish        <tibble [4 x 3]> <acf> 
4 Silver Perch   <tibble [6 x 3]> <acf> 

步骤 3 我使用 facf 函数将 ccf 函数的输出转换为 tibble。根据需要修改此功能。

# A tibble: 4 x 4
# Groups:   Commonname [4]
  Commonname     data             ccf    acf              
  <chr>          <list>           <list> <list>           
1 Black Sea Bass <tibble [5 x 3]> <acf>  <tibble [9 x 2]> 
2 Pinfish        <tibble [5 x 3]> <acf>  <tibble [9 x 2]> 
3 Pigfish        <tibble [4 x 3]> <acf>  <tibble [7 x 2]> 
4 Silver Perch   <tibble [6 x 3]> <acf>  <tibble [11 x 2]>

如您所见,我们有一个非常简洁的 tibble 这里包含计算的所有中间步骤。在第 4 步中,我使用 unnest 函数开发了我感兴趣的结果。

# A tibble: 36 x 5
# Groups:   Commonname [4]
   Commonname     data             ccf         aacf   lag
   <chr>          <list>           <list>     <dbl> <dbl>
 1 Black Sea Bass <tibble [5 x 3]> <acf>   0.0911      -4
 2 Black Sea Bass <tibble [5 x 3]> <acf>  -0.518       -3
 3 Black Sea Bass <tibble [5 x 3]> <acf>   0.932       -2
 4 Black Sea Bass <tibble [5 x 3]> <acf>  -0.470       -1
 5 Black Sea Bass <tibble [5 x 3]> <acf>  -0.248        0
 6 Black Sea Bass <tibble [5 x 3]> <acf>   0.213        1
 7 Black Sea Bass <tibble [5 x 3]> <acf>   0.0109       2
 8 Black Sea Bass <tibble [5 x 3]> <acf>  -0.0110       3
 9 Black Sea Bass <tibble [5 x 3]> <acf>   0.000854     4
10 Pinfish        <tibble [5 x 3]> <acf>   0.146       -4
# ... with 26 more rows

使用 ggplot2 包可以很容易地在漂亮的图上创建此类数据。

在这里,我划掉了 lag 函数中的 acf 值,并细分为各个 Commonname 组。

也许这不是您期望的那种图表。但是,我希望,在知道正确且简单的路径后,您将能够根据自己的需要进行调整。如果您有任何疑问,请写在评论中。祝你好运!

更新 1 你可以这样做

df %>% group_by(Commonname) %>%
  nest() %>%  #1
  mutate(ccf = map(data, ~fccf(.x))) %>% #2
  mutate(acf = map(ccf, ~facf(.x))) %>%  #3
  unnest(acf) %>%  #4
  ggplot(aes(lag, aacf, fill = Commonname, colour = Commonname))+
  geom_point()+
  geom_text(aes(label = Commonname), 
             size=3.5, alpha = 0.6, colour = "black",
             hjust = 1, vjust = 1)

或者这样

...  geom_label(aes(label = Commonname), 
             size=3.5, alpha = 0.2, colour = "black",
             hjust = 1, vjust = 1)

或其他任何东西。 ggplot2 包在这方面很棒!