有没有办法计算 R 中多个因变量的阈值以上的峰数?
Is there a way to calculate the number of peaks above a threshold for multiple dependent variables in R?
如果这个问题已经被问到,我深表歉意。我是 R 的初学者,没有高级统计背景。我正在尝试确定 R 中数据的峰数(最大值)。对于那些熟悉 GraphPad Prism 的人来说,本质上我试图通过进行曲线下面积分析并使用阈值来找到“峰数” y=2。我的数据框在下面(称为 example1)。
time a b c d e f
0 248 413 473 370 501 235
3 243 408 468 356 496 237
6 243 406 476 354 503 235
9 243 412 469 352 500 232
12 245 411 467 355 504 235
15 241 420 483 348 499 227
18 239 416 477 344 493 230
21 236 413 478 338 490 227
24 234 406 475 337 481 229
我的 x 变量将是第一列,我的 y 变量将是其余列(非常大的数据集 - 50 多个因变量)。对于每个因变量或列,我试图找到峰值(局部最大值)的数量。我需要让我的 y 阈值 = 2.
我已经通过融化我的数据框使用 ggplot 绘制了我的数据(下面的代码)。
#Melt data
melted <- melt(example1, id.vars="time")
#Create line graph
ggplot(data=melted, aes(x=time, y=value, group=variable)) +
geom_line(show.legend = TRUE))
如何计算和输出每列的峰数(y=2 阈值)?我需要做曲线下面积分析吗?我希望计算出这样的东西(每列的峰数)......
a = 0, b = 3, c = 0, d = 6, e = 1, f = 0
但输出可能类似于 0, 3, 0, 6, 1, 0
我不需要制作另一个图表。我只需要输出每个因变量的峰数。
如果您正在寻找的是局部最大值或最小值,您可以查看此 post。
如果是您要查找的内容,那么您只需为每一列执行此操作:
df <- data.frame(var1 = c(1,2,3,2,1, 1, 2, 1),
var2 = c(1,2,3,2,1, 1, 1, 1),
var3 = c(1,2,3,2,1, 5, 1, 2))
res_list <- apply(df, 2, function(x){
return(which(diff(sign(diff(x)))==-2)+1)
})
res_list :
$var1
[1] 3 7
$var2
[1] 3
$var3
[1] 3 6
它不适用于您域边缘的极值。
pracma
包中有一个 findpeaks()
函数,对这类事情特别有用。 See documentation here。您可以指定阈值或使用默认设置。还有一些参数可以帮助忽略或包括跨越多个点的峰值。
你输入 findpeaks()
时间序列向量(意味着确保它首先按你的 x 轴排序),它会输出一个矩阵,其中行数对应于峰数,对于每个峰,您将获得最大值(y 值)、索引、开始索引和结束索引。请参阅下面您的 example1
数据集的利用率:
peak_info <- lapply(example1[,2:7], findpeaks, threshold=2)
> peak_info
$a
[,1] [,2] [,3] [,4]
[1,] 245 5 4 9
$b
[,1] [,2] [,3] [,4]
[1,] 420 6 5 9
$c
[,1] [,2] [,3] [,4]
[1,] 476 3 2 5
[2,] 483 6 5 7
$d
[,1] [,2] [,3] [,4]
[1,] 355 5 4 9
$e
[,1] [,2] [,3] [,4]
[1,] 503 3 2 4
[2,] 504 5 4 9
$f
[,1] [,2] [,3] [,4]
[1,] 237 2 1 4
[2,] 235 5 4 6
[3,] 230 7 6 8
如果你只是想知道峰的数量,你可以运行如下:
> unlist(lapply(peak_info, nrow))
a b c d e f
1 1 2 1 2 3
如果这个问题已经被问到,我深表歉意。我是 R 的初学者,没有高级统计背景。我正在尝试确定 R 中数据的峰数(最大值)。对于那些熟悉 GraphPad Prism 的人来说,本质上我试图通过进行曲线下面积分析并使用阈值来找到“峰数” y=2。我的数据框在下面(称为 example1)。
time a b c d e f
0 248 413 473 370 501 235
3 243 408 468 356 496 237
6 243 406 476 354 503 235
9 243 412 469 352 500 232
12 245 411 467 355 504 235
15 241 420 483 348 499 227
18 239 416 477 344 493 230
21 236 413 478 338 490 227
24 234 406 475 337 481 229
我的 x 变量将是第一列,我的 y 变量将是其余列(非常大的数据集 - 50 多个因变量)。对于每个因变量或列,我试图找到峰值(局部最大值)的数量。我需要让我的 y 阈值 = 2.
我已经通过融化我的数据框使用 ggplot 绘制了我的数据(下面的代码)。
#Melt data
melted <- melt(example1, id.vars="time")
#Create line graph
ggplot(data=melted, aes(x=time, y=value, group=variable)) +
geom_line(show.legend = TRUE))
如何计算和输出每列的峰数(y=2 阈值)?我需要做曲线下面积分析吗?我希望计算出这样的东西(每列的峰数)...... a = 0, b = 3, c = 0, d = 6, e = 1, f = 0 但输出可能类似于 0, 3, 0, 6, 1, 0
我不需要制作另一个图表。我只需要输出每个因变量的峰数。
如果您正在寻找的是局部最大值或最小值,您可以查看此 post。
如果是您要查找的内容,那么您只需为每一列执行此操作:
df <- data.frame(var1 = c(1,2,3,2,1, 1, 2, 1),
var2 = c(1,2,3,2,1, 1, 1, 1),
var3 = c(1,2,3,2,1, 5, 1, 2))
res_list <- apply(df, 2, function(x){
return(which(diff(sign(diff(x)))==-2)+1)
})
res_list :
$var1
[1] 3 7
$var2
[1] 3
$var3
[1] 3 6
它不适用于您域边缘的极值。
pracma
包中有一个 findpeaks()
函数,对这类事情特别有用。 See documentation here。您可以指定阈值或使用默认设置。还有一些参数可以帮助忽略或包括跨越多个点的峰值。
你输入 findpeaks()
时间序列向量(意味着确保它首先按你的 x 轴排序),它会输出一个矩阵,其中行数对应于峰数,对于每个峰,您将获得最大值(y 值)、索引、开始索引和结束索引。请参阅下面您的 example1
数据集的利用率:
peak_info <- lapply(example1[,2:7], findpeaks, threshold=2)
> peak_info
$a
[,1] [,2] [,3] [,4]
[1,] 245 5 4 9
$b
[,1] [,2] [,3] [,4]
[1,] 420 6 5 9
$c
[,1] [,2] [,3] [,4]
[1,] 476 3 2 5
[2,] 483 6 5 7
$d
[,1] [,2] [,3] [,4]
[1,] 355 5 4 9
$e
[,1] [,2] [,3] [,4]
[1,] 503 3 2 4
[2,] 504 5 4 9
$f
[,1] [,2] [,3] [,4]
[1,] 237 2 1 4
[2,] 235 5 4 6
[3,] 230 7 6 8
如果你只是想知道峰的数量,你可以运行如下:
> unlist(lapply(peak_info, nrow))
a b c d e f
1 1 2 1 2 3