#####设置文件路径###### setwd("D:\山西月降水站点数据\") #####原始数据##### library(openxlsx) data<-read.csv("shanghai_testdata.xlsx",colNames = FALSE) data<-as.matrix(data) #####对数据求倒序##### data_dx<-rev(data) data_dx<-matrix(data_dx) n<-length(data) #######MK检验####### Q<-matrix(0,1,n) UF<-matrix(0,1,n) UB<-matrix(0,1,n) h<-matrix(0,n,n) for (i in 1:n) { for (j in 1:n) { if(data[i,1]>data[j,1]){ h[i,j]<-1 } else h[i,j]<-0 } Q[1,i]<-sum(h[lower.tri(h)]) UF[1,i]<-(Q[1,i]-(i*(i-1)/4))/sqrt((i*(i-1)(2i+5))/72) } #####计算UB##### h<-matrix(0,n,n) for (i in 1:n) { for (j in 1:n) { if(data_dx[i,1]>data_dx[j,1]){ h[i,j]<-1 } else h[i,j]<-0 } Q[1,i]<-sum(h[lower.tri(h)]) UB[1,i]<-(Q[1,i]-(i*(i-1)/4))/sqrt((i*(i-1)(2i+5))/72) } #####绘图##### UF[1,1]<-0 UB[1,1]<-0 plot(x=1900:1990,y=UF,ylim = c(-4,8),type = "l",ylab = "",xaxt="n") lines(x=1900:1990,y=-rev(UB),type = "l",lty=2) lines(x=1900:1990,y=rep(1.96,91),type = "l") lines(x=1900:1990,y=rep(-1.96,91),type = "l") lines(x=1900:1990,y=rep(0,91),type = "l") title("MK检验_上海") axis(1,1900:1990,1900:1990,las=1) #####输出突变年份##### year_mk<-1900:1990 year_point<-year_mk[which((as.numeric(UF)-(-rev(UB)))>0)[1]-1] print(year_point)把这段代码修改为多站点数据可以使用的代码
时间: 2024-02-28 15:57:45 浏览: 72
好的,下面是修改后的代码,可以用于多站点数据的MK检验:
```
#####设置文件路径######
setwd("D:\山西月降水站点数据\")
#####读取所有站点数据######
file_list <- list.files(path = ".", pattern = ".csv")
data_list <- list()
for (file in file_list) {
data <- read.csv(file, colNames = FALSE)
data_list[[file]] <- as.matrix(data)
}
#####MK检验函数######
MK_test <- function(data) {
#####对数据求倒序#####
data_dx <- rev(data)
data_dx <- matrix(data_dx)
n <- length(data)
#######MK检验#######
Q <- matrix(0, 1, n)
UF <- matrix(0, 1, n)
UB <- matrix(0, 1, n)
h <- matrix(0, n, n)
for (i in 1:n) {
for (j in 1:n) {
if (data[i, 1] > data[j, 1]) {
h[i, j] <- 1
} else {
h[i, j] <- 0
}
}
Q[1, i] <- sum(h[lower.tri(h)])
UF[1, i] <- (Q[1, i] - (i * (i - 1) / 4)) / sqrt((i * (i - 1) * (2 * i + 5)) / 72)
}
#####计算UB#####
h <- matrix(0, n, n)
for (i in 1:n) {
for (j in 1:n) {
if (data_dx[i, 1] > data_dx[j, 1]) {
h[i, j] <- 1
} else {
h[i, j] <- 0
}
}
Q[1, i] <- sum(h[lower.tri(h)])
UB[1, i] <- (Q[1, i] - (i * (i - 1) / 4)) / sqrt((i * (i - 1) * (2 * i + 5)) / 72)
}
#####输出突变年份#####
year_mk <- 1:n
year_point <- year_mk[which((as.numeric(UF) - (-rev(UB))) > 0)[1] - 1]
return(year_point)
}
#####对所有站点进行MK检验,并输出突变年份#####
for (i in 1:length(data_list)) {
data <- data_list[[i]]
year_point <- MK_test(data)
print(paste(file_list[i], "的突变年份为:", year_point))
}
```
这段代码的主要修改是使用循环读取所有站点的数据,并对每个站点进行MK检验。具体操作如下:
1. 使用`list.files()`函数读取文件夹中所有以.csv结尾的文件,保存在`file_list`变量中。
2. 使用循环读取每个文件的数据,并保存在`data_list`列表中。
3. 定义`MK_test()`函数,用于对单个站点的数据进行MK检验,具体操作和原代码相同。
4. 使用循环遍历`data_list`列表中的每个站点数据,并调用`MK_test()`函数进行MK检验,输出突变年份。
需要注意的是,每个站点数据的文件名需要包含该站点的名称或标识,以便在输出结果中区分不同站点。另外,该代码仅适用于所有站点数据的格式相同的情况,如果不同站点数据的格式不同,则需要对`MK_test()`函数进行修改以适应不同格式的数据。
阅读全文