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

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'

错误原因

  1. 提取单用户数据时,Mfrq.df.2[i,2:11]返回的是数据框类型,而nls()需要向量格式的响应变量
  2. 公式中eaUser[i]属于错误索引:单用户数据已是一行,无需额外索引
  3. 未提前初始化存储结果的变量,也未从拟合模型中提取所需的参数与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:41:25