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
相关产品推荐
相关产品推荐

