R语言基于Monte Carlo的Mann Kendall时序功效分析mk.test报错求助
报错原因及修复方法
报错触发的直接原因是trend包的mk.test()函数要求输入数值向量,但你传入的是数据框类型:
read.csv()读取返回的simdata是包含Rain列的表格结构(数据框),即使使用c(simdata)转换,得到的是单元素列表,并非数值向量。- 仅消除报错可直接将循环内的
x <- c(simdata)替换为x <- simdata$Rain,但你的现有代码不符合Monte Carlo Mann-Kendall功效分析的逻辑:循环2000次全部对同一组原始数据做检验,得到的结果没有实际功效意义。
修正后可运行的完整功效分析代码
library(trend) # 基础参数设置 alpha <- 0.05 sims_run <- 2000 save_p <- vector(length = sims_run) # 读取原始数据,提取数值列 simdata <- read.csv("trend.csv", header = TRUE) rain_obs <- simdata$Rain n <- length(rain_obs) # 可自行调整要检验的预设趋势幅度,示例设置为原始序列极差的5%整体升幅 trend_magnitude <- 0.05 * diff(range(rain_obs)) # Monte Carlo模拟循环 for(i in 1:sims_run){ # 生成带预设趋势的模拟序列,采用残差自助法逻辑,可根据你需要的分布假设调整 sim_series <- rain_obs + rnorm(n, mean = 0, sd = sd(rain_obs)) + seq(from=0, to=trend_magnitude, length.out = n) # 传入数值向量执行MK检验 t.out <- mk.test(sim_series) save_p[i] <- t.out$p.value } # 计算功效:正确检测到预设趋势的概率 decision <- length(which(save_p < alpha)) paste("显著拒绝原假设次数=", decision) power <- decision / sims_run paste("MK检验功效=", power)
补充说明
如果你不需要做功效分析,仅需要对原始序列做单次Mann-Kendall检验,可直接运行以下代码,无需循环:
library(trend) simdata <- read.csv("trend.csv", header = TRUE) mk.test(simdata$Rain)
内容的提问来源于stack exchange,提问作者CKrish
相关产品推荐
相关产品推荐

