gpt4 book ai didi

r - 如何使用循环在多个站点上执行 Mann-kendall 测试?

转载 作者:行者123 更新时间:2023-12-05 03:01:50 34 4
gpt4 key购买 nike

我刚开始使用 R,想使用 modifiedmk 包对月度地下水位数据进行测试。我的数据框 (GL) 看起来像这样

GL

well year month value
684 1994 Jan 8.53
684 1995 Jan 8.74
684 1996 Jan 8.88
684 1997 Jan 8.24
1001 2000 Jan 9.1
1001 2001 Jan 9.2
1001 2002 Jan 9.54
1001 2003 Jan 9.68
2003 1981 Jan 55.2
2003 1982 Jan 55.8
2003 1983 Jan 56.4
2003 1984 Jan 53.2

首先我创建了一个孔列表和一个用于打印结果的 results_list 文件

well_list <- unique(GL$well)
results_list <- vector("list", length(well_list))

然后我创建了一个我认为是循环的东西

for(i in well_list){
results_list[[grep(i, well_list)]] <- MannKendall(GL[,4])
}
names(results_list) <- well_list

但我一直收到这个错误

Error in Kendall(1:length(x), x) : length(x)<3

我可以让这段代码工作(这是我从这里的另一篇文章中得到的)但我不想执行预美白方法

for(i in well_list){
tempDF <- GL1[GL$well == i, ]
c<-acf(tempDF$value,lag.max=1)
t <- dim(c$acf)
tempDF$prewhit1<-c$acf[[t[1], t[2], t[3]]]*tempDF$value
prewhitseries<-data.frame(with(tempDF,(tempDF$value[-1] - prewhit1[
length(prewhit1)])))
autocordata<-cbind(tempDF[-1,],prewhitseries)
results_list[[grep(i, well_list)]] <- MannKendall(autocordata[,5])}
names(results_list) <- well_list

最佳答案

应该做这样的事情。 split() 沿 well 列拆分,为每个孔创建一个包含向量的列表。只保留长度为 3 或以上的向量。然后使用 lapply()

在每个剩余向量上运行 MannKendall()
library(Kendall)

tt <- read.table(text="
well year month value
684 1994 Jan 8.53
684 1995 Jan 8.74
684 1996 Jan 8.88
684 1997 Jan 8.24
1001 2000 Jan 9.1
1001 2001 Jan 9.2
1001 2002 Jan 9.54
1001 2003 Jan 9.68
2003 1981 Jan 55.2
2003 1982 Jan 55.8
2003 1983 Jan 56.4
2003 1984 Jan 53.2
2004 1984 Jan 53.2", header=TRUE)

tt.wells <- split(tt$value, tt$well)
tt.wells <- tt.wells[lengths(tt.wells) >= 3]

lapply(tt.wells, MannKendall)

# $`684`
# tau = 0, 2-sided pvalue =1

# $`1001`
# tau = 1, 2-sided pvalue =0.089429

# $`2003`
# tau = 0, 2-sided pvalue =1

关于r - 如何使用循环在多个站点上执行 Mann-kendall 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55483849/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com