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

R语言nls拟合玻尔兹曼方程:预测匹配但系数偏差问题

玻尔兹曼方程拟合电生理数据:系数偏离但预测值匹配良好

我尝试用玻尔兹曼方程拟合电生理数据,遇到一个奇怪的问题:使用真实数据时,nls函数返回的预测值和输入数据匹配良好,但拟合得到的系数完全偏离预期。

模拟数据测试(结果正常)

用模拟数据测试拟合函数时,预测值和拟合系数都准确:

# generate sample data
V <- seq(-60,40,5)
Vhalf <- -20
k <- 10
G <- (1/(1 + exp((Vhalf - V) / k)) + rnorm(length(V), sd = 0.05))

# normalization
normalize <- function(x, range = c(0, 1)) {
  if (!is.numeric(x)) {
    stop("Input x must be a numeric vector")
  }
  
  min_x <- min(x)
  max_x <- max(x)
  
  normalized_x <- (x - min_x) / (max_x - min_x)
  
  min_range <- range[1]
  max_range <- range[2]
  
  normalized_x * (max_range - min_range) + min_range
}

G <- normalize(G)

# fit function
boltzmann_eqn <- function(V, Vhalf, k) {
  (1 / (1 + exp((Vhalf - V) / k)))
}
  
# starting parameters and fit
start_Vhlaf <- -10
start_k <- 10

fit <- nls(
  G ~ boltzmann_eqn(V, Vhalf, k),
  start = list(Vhalf = start_Vhlaf, k = start_k),
  algorithm = "port",
  control = list(
    maxiter = 1000,
    tol = abs(min(V)) * 1e-05,
    minFactor = abs(min(V)) * 1e-05
  )
)

coef(fit)
predicted.value <- predict(fit)

# plot actual and fitted values
library(ggplot2)
data <- data.frame(V,G,predicted.value)
ggplot(data,aes(x=V,y=G))+
  geom_point()+
  geom_line(aes(y=predicted.value))

真实数据拟合(系数偏离)

换成真实数据后,预测值和数据依然匹配,但拟合系数完全偏离:

# real data for G
V <- seq(-60,40,5)
G <- c(
    2.886126e-10,
    2.299096e-10,
    3.479653e-10,
    3.854844e-10,
    5.786606e-10,
    6.859901e-10,
    9.479952e-10,
    1.107524e-09,
    1.569197e-09,
    1.685586e-09,
    2.163985e-09,
    2.231026e-09,
    3.036547e-09,
    3.402246e-09,
    3.396888e-09,
    4.070637e-09,
    4.297097e-09,
    4.218705e-09,
    4.651377e-09,
    5.019147e-09,
    5.336356e-09
  )

# normalization
normalize <- function(x, range = c(0, 1)) {
  if (!is.numeric(x)) {
    stop("Input x must be a numeric vector")
  }
  
  min_x <- min(x)
  max_x <- max(x)
  
  normalized_x <- (x - min_x) / (max_x - min_x)
  
  min_range <- range[1]
  max_range <- range[2]
  
  normalized_x * (max_range - min_range) + min_range
}

G <- normalize(G)

# fit function
boltzmann_eqn <- function(V, Vhalf, k) {
  (1 / (1 + exp((Vhalf - V) / k)))
}

# starting parameters and fit
start_Vhlaf <- -10
start_k <- 10

fit <- nls(
  G ~ boltzmann_eqn(V, Vhalf, k),
  start = list(Vhalf = start_Vhlaf, k = start_k),
  algorithm = "port",
  control = list(
    maxiter = 1000,
    tol = abs(min(V)) * 1e-05,
    minFactor = abs(min(V)) * 1e-05
  )
)

coef(fit)
predicted.value <- predict(fit)

# plot actual and fitted values
library(ggplot2)
data <- data.frame(V,G,predicted.value)
ggplot(data,aes(x=V,y=G))+
  geom_point()+
  geom_line(aes(y=predicted.value))

我没看出模拟数据和真实数据的明显差异,只猜测真实数据可能未完全饱和,但无法理解为什么系数偏离的同时预测效果还很好——这两者应该是相关的。恳请给出解决建议,感谢帮助!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:24:55