R 中的 For 循环错误消息:qr.default(t(const)) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 1)

For loop in R error message: Error in qr.default(t(const)) : NA/NaN/Inf in foreign function call (arg 1)

提问人:JaFranke 提问时间:10/23/2023 最后编辑:JaFranke 更新时间:10/23/2023 访问量:62

问:

请帮我修复这个循环。

要下载数据,请键入以下命令,请注意,“用户名”和“密码”需要替换为人类死亡率数据库中的日志记录信息。您可以访问网站 https://mortality.org/ 并创建帐户(将花费不到 30 秒的时间)。

library(demography)
JPNmort <- hmd.mx(country = "JPN", username = "username", password = "password")
library(demography)
library(splines)

#Read Japan mortality data from the Human Mortality Database
JPNmort <- hmd.mx("JPN","username","password")

age = 2:110

data1= cbind(1:109, 
                 JPNmort[["rate"]][["total"]][age, "2016"], 
                 JPNmort[["pop"]][["total"]][age, "2016"])
data2 = cbind(1:109, 
                   JPNmort[["rate"]][["total"]][age, "2017"],
                   JPNmort[["pop"]][["total"]][age, "2017"])



#Reformat data rows and columns
column.names = c("Age", "mu_x", "Ec_x")
rownames(data1) = NULL
rownames(data2) = NULL

colnames(data1) = column.names
colnames(data2) = column.names

the.knots <- c(10,20,30,40,50,60,70,80,90,100)
hyper_param <- expand.grid(
  unlist(lapply(seq_along(the.knots), combn, x = the.knots, simplify = FALSE), recursive = FALSE),
  c(0)
)

colnames(hyper_param) <- c("knots", "Error.Rate")

# Initialize lists to store the results
my.basis <- vector("list", nrow(hyper_param))
my.spline <- vector("list", nrow(hyper_param))


for (i in 1:nrow(hyper_param)) {
  

  my.knots <- as.numeric(unlist(hyper_param[i, 1]))
  

  my.basis[[i]] <- ns(data1[, "Age"], 
                      knots = setdiff(my.knots, c(my.knots[1], my.knots[length(my.knots)])), 
                      Boundary.knots = c(my.knots[1], my.knots[length(my.knots)])
  )
  my.spline[[i]] <- lm(data1[, "mu_x"] ~ my.basis[[i]], weights = data1[, "Ec_x"] / data1[, "mu_x"])
  
 
  hyper_param$Error.Rate[i] <- mean((data2[, "mu_x"] - fitted(my.spline[[i]]))^2)
}

当我使用特定值进行修复时,代码可以完美运行,但是当我运行for循环时,它会返回错误消息:i

Error in qr.default(t(const)) : 
  NA/NaN/Inf in foreign function call (arg 1)
R for 循环 错误处理 语法错误 样条

评论

0赞 Mark 10/23/2023
您是否尝试过在它上运行/您是否熟悉 R 中的工作原理?debug()debug()
0赞 Limey 10/23/2023
@Mark:显然OP没有!OP:请使您的代码可重现 - vs 并确定 .是,还是别的地方?社区很乐意为您提供帮助,但希望您付出足够的努力来允许我们这样做。the.knotstheknotsnsshinysplines
0赞 Mark 10/23/2023
@Limey idk伴侣,我宁愿不假设。显然,这不太可能,但并非不可能。提出它的一部分是,如果 OP 没有听说过它,他们可以了解它
0赞 JaFranke 10/23/2023
谢谢@Mark和Limey!很抱歉,我刚刚编辑了代码,以便可以重现。
0赞 JaFranke 10/23/2023
谢谢马克和@Limey!很抱歉,我刚刚编辑了代码,以便可以重现。–

答:

1赞 Elisa Thouverai 10/23/2023 #1

错误由以下因素给出:

my.basis[[i]] <- ns(data1[, "Age"], 
                      knots = setdiff(my.knots, c(my.knots[1], my.knots[length(my.knots)])), 
                      Boundary.knots = c(my.knots[1], my.knots[length(my.knots)])
  )

具体来说,前 9 个元素不是具有多个元素的向量,因此该函数给出一个 numeric(0) 作为结果。 要解决这个问题,你可以从 10 开始你的 for 循环,或者添加一个 if(),在那里你可以通过长度来区分结。hyper_paramsetdiff()

评论

0赞 JaFranke 10/23/2023
绝对的天才!非常感谢 Thouverai @Elisa。你的回答已经完全解决了问题。