提问人:JaFranke 提问时间:10/23/2023 最后编辑:JaFranke 更新时间:10/23/2023 访问量:62
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)
问:
请帮我修复这个循环。
要下载数据,请键入以下命令,请注意,“用户名”和“密码”需要替换为人类死亡率数据库中的日志记录信息。您可以访问网站 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)
答:
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_param
setdiff()
评论
0赞
JaFranke
10/23/2023
绝对的天才!非常感谢 Thouverai @Elisa。你的回答已经完全解决了问题。
评论
debug()
debug()
the.knots
theknots
ns
shiny
splines