You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言MARSS包循环运行时报U参数不允许错误如何解决?

问题描述

需要通过循环运行26个矩阵,其中13个为数值型矩阵(示例值:1,1,2,2,2,3),另外13个为字符型矩阵用于模拟不同参数(示例值:U1、U2、U3等),期望在循环中依次调用每个矩阵的首项同步传入函数运行,但运行时报如下错误:

Errors were caught in checkModelList The model value for U is not allowed. Check ?MARSS.form Error: Stopped in checkModelList() due to specification problem(s).

相关数据结构
str(Y)
 num [1:43, 1:24] NA NA NA 0.158 -1.172 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:43] "WGR_D_l.s" "WGR_D_l.m" "WGR_D_l.l" "WGR_Sh_l.s" ...
  ..$ : NULL
str(Z1)
 num [1:43, 1] 1 1 1 1 1 1 1 1 1 1 ...
str(U1)
 chr [1, 1] "U1"
现有循环代码
z = c("Z1_","Z2_",'Z3_', 'Z4_', 'Z5_', "Z6_","Z7_",'Z8_', 'Z9_', 'Z10_','Z11_', 'Z12_', 'Z13_')
u = c("U1_","U2_",'U3_', 'U4_', 'U5_', "U6_","U7_",'U8_', 'U9_', 'U10_','U11_', 'U12_', 'U13_')
Q = c("unconstrained", "diagonal and unequal", "diagonal and equal")
q = c('Qun1','Qdu1','Qde1')
    
for(g in 1:length(U)){
  model01$U = U[g]

  for(i in 1:length(Z)){
     model01$Z = Z[[i]]

      for(j in 1:length(Q)){
        model01$Q = Q[j]

        print(paste(q[j], sep=""))

        m1 = MARSS(Y, model=model01,
                   control=list(maxit = 5000,trace = -1, conv.test.slope.tol=100),
                   silent=2, method="kem")

        model.name.txt = paste("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/1. RUN_Nocovariates_2xU/TXT/",q[j],'.txt', sep='')
        capture.output(m1,file=model.name.txt)
        print(model.name.txt)
        model.name.rds = paste("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/1. RUN_Nocovariates_2xU/RDS/",q[j], '.rds', sep='')
        print(model.name.rds)
        saveRDS(m1,model.name.rds)
      }#j
   }#i
 }#end g

手动逐个传入参数运行时代码可正常执行,单轮运行示例如下:

Q = c("unconstrained", "diagonal and unequal", "diagonal and equal")
q = c('Qun1','Qdu1','Qde1')
h = "catches raw"

      for(j in 1:length(Q)){
        model01$Q = Q[j]

        print(paste(q[j], sep=""))

        m1 = MARSS(Y, model=model01,
                   control=list(maxit = 5000,trace = -1, conv.test.slope.tol=100),
                   silent=2, method="kem")

        model.name.txt = paste("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/RUN_NAO_catches_raw_2xU/TXT/",q[j],h[1],'.txt', sep='')
        capture.output(m1,file=model.name.txt)
        print(model.name.txt)
        model.name.rds = paste("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/RUN_NAO_catches_raw_2xU/RDS/",q[j],h[1], '.rds', sep='')
        print(model.name.rds)
        saveRDS(m1,model.name.rds)
      }#j
报错原因
  • R大小写敏感,你定义的U参数存储向量是小写u,循环中调用的是大写U,变量名不匹配导致取值错误。
  • 你存储的u、z向量内都是字符串,不是实际的矩阵对象,直接赋值给model01$U相当于传入了字符串,不符合MARSS对U参数的矩阵结构要求,触发校验报错。
  • 原始代码没有把字符串类型的变量名转换为全局环境中实际的矩阵对象,导致参数传入类型错误。
解决方案

使用get()函数将字符串转为对应环境的矩阵对象,同时修正变量名匹配问题,避免结果覆盖,修改后代码如下:

# 定义参数名称,和全局环境中实际的U1~U13、Z1~Z13矩阵名称对应
z_names = paste0("Z", 1:13)
u_names = paste0("U", 1:13)
Q = c("unconstrained", "diagonal and unequal", "diagonal and equal")
q = c('Qun1','Qdu1','Qde1')

# 提前初始化model01结构,保证符合MARSS参数要求
model01 <- list()

for(g in seq_along(u_names)){
  # 把字符串转为实际的U矩阵对象
  model01$U = get(u_names[g])

  for(i in seq_along(z_names)){
     # 把字符串转为实际的Z矩阵对象
     model01$Z = get(z_names[i])

      for(j in seq_along(Q)){
        model01$Q = Q[j]
        # 文件名拼接U、Z标识,避免不同参数结果互相覆盖
        current_prefix = paste0(u_names[g], "_", z_names[i], "_", q[j])

        m1 = MARSS(Y, model=model01,
                   control=list(maxit = 5000,trace = -1, conv.test.slope.tol=100),
                   silent=2, method="kem")

        model.name.txt = paste0("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/1. RUN_Nocovariates_2xU/TXT/",current_prefix,'.txt')
        capture.output(m1,file=model.name.txt)
        print(model.name.txt)
        model.name.rds = paste0("C:/Users/ubeda/OneDrive/Desktop/Resultados post-TFM/1. RUN_Nocovariates_2xU/RDS/",current_prefix, '.rds')
        print(model.name.rds)
        saveRDS(m1,model.name.rds)
      }
   }
}

运行前请先确认全局环境中已正确定义U1U13、Z1Z13的矩阵对象,结构与你提供的U1、Z1一致即可。

内容的提问来源于stack exchange,提问作者user241296

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:12:00