R语言每行数据nls拟合及系数、SSE保存问题求助
指数模型拟合问题解决方案
问题背景
现有一个包含520个用户ID及10个区间频数统计的DataFrame,目标为每行用户拟合指数模型(使用nls()),并新增A、k、SSE三列分别记录模型参数与残差平方和。用户尝试的代码运行报错。
用户提供的示例数据
Mfrq.df.2 <- structure(list(User.ID = c("37593", "38643", "49433", "60403", "70923"), V1 = c(9L, 3L, 4L, 80L, 19L), V2 = c(10L, 0L, 29L, 113L, 21L), V3 = c(5L, 2L, 17L, 77L, 7L), V4 = c(2L, 2L, 16L, 47L, 4L), V5 = c(2L, 10L, 16L, 40L, 1L), V6 = c(4L, 0L, 9L, 22L, 1L), V7 = c(6L, 8L, 9L, 8L, 0L), V8 = c(2L, 17L, 16L, 24L, 2L ), V9 = c(3L, 20L, 7L, 30L, 0L), V10 = c(2L, 11L, 5L, 11L, 2L )), row.names = c(NA, 5L), class = "data.frame")
用户原代码及错误信息
原代码:
FreqBin=c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) for (i in 1:nrow(Mfrq.df.2)){ eaUser=Mfrq.df.2[i,2:11] ExpFit[i]=nls(eaUser[i]~A*exp(k*FreqBin), start=c(A=1, k=0.01)) }
报错信息:
Error in model.frame.default(formula = ~eaUser + i + FreqBin) : invalid type (list) for variable 'eaUser'
错误原因
- 提取单用户数据时,
Mfrq.df.2[i,2:11]返回的是数据框类型,而nls()需要向量格式的响应变量 - 公式中
eaUser[i]属于错误索引:单用户数据已是一行,无需额外索引 - 未提前初始化存储结果的变量,也未从拟合模型中提取所需的参数与SSE值
修正后的代码
# 定义区间向量 FreqBin <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # 初始化结果列 Mfrq.df.2$A <- NA Mfrq.df.2$k <- NA Mfrq.df.2$SSE <- NA # 循环处理每个用户 for (i in 1:nrow(Mfrq.df.2)) { # 将单用户频数转为向量 ea_freq <- as.numeric(Mfrq.df.2[i, 2:11]) # 构建拟合用的数据框 fit_data <- data.frame(y = ea_freq, x = FreqBin[1:length(ea_freq)]) # 使用tryCatch处理拟合失败的情况(避免循环中断) fit_result <- tryCatch({ nls(y ~ A * exp(k * x), data = fit_data, start = list(A = 1, k = 0.01)) }, error = function(e) { message(paste("用户", Mfrq.df.2$User.ID[i], "拟合失败:", e$message)) return(NULL) }) # 提取结果并赋值 if (!is.null(fit_result)) { params <- coef(fit_result) Mfrq.df.2$A[i] <- params["A"] Mfrq.df.2$k[i] <- params["k"] Mfrq.df.2$SSE[i] <- sum(resid(fit_result)^2) } } # 查看结果 head(Mfrq.df.2)
代码说明
- 将单用户频数数据转为数值向量,确保
nls()能正确识别响应变量 - 构建专用的拟合数据框,明确自变量与因变量,避免公式解析错误
- 加入
tryCatch捕获拟合失败的情况(比如初始值不合适、数据无法拟合模型),保证循环能完整执行 - 从拟合模型中提取系数
A、k,并计算残差平方和SSE赋值到对应列
内容的提问来源于stack exchange,提问作者MK25
相关产品推荐
相关产品推荐

