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

使用R中simex结合nls+幂均值方法时遇测量误差报错求助

问题:simex校正非线性最小二乘模型测量误差时报错

错误提示

Error: measurement.error is constant 0 in column(s) 1

场景说明

用R的nls()拟合了带异方差校正(拟合值幂函数加权)的非线性模型,尝试用simex包校正自变量的测量误差,明明指定了非零测量误差,却触发上述错误。

复现代码

library(simex)
set.seed(123456789)
x = runif(n = 1000, min = 1, max = 3.6)
x_err = x + rnorm(n = 1000, mean = 0, sd = 0.1)
y_mean = 100/(1+10^(log10(100)-x)*0.75)
y_het = y_mean + rnorm(n = 1000, mean = 0, sd = 10*x^-2)
y_het = ifelse(y_het > 0, y_het, 0)
w = (100/(1+10^(log10(100)-x_err)*0.75))^-2

nls_fit = nls(y_het ~ 100/(1+10^((log10(k)-x_err)*h)), start = list("k" = 100, "h" = 0.75), weights = 1/w)

simex(nls_fit, SIMEXvariable = "x_err", measurement.error = 0.1, asymptotic = F)

原因与解决方法

错误原因

simex无法从带权重的nls模型中正确识别自变量的测量误差参数,加权操作改变了模型内部的变量结构,导致工具误判测量误差为0。

解决方法

方法1:分离加权与测量误差校正步骤

先拟合无权重的nls模型,用simex完成测量误差校正后,再手动应用异方差加权:

# 拟合无权重的基础模型
nls_fit_unweighted = nls(y_het ~ 100/(1+10^((log10(k)-x_err)*h)), start = list("k" = 100, "h" = 0.75))
# 用simex校正测量误差
simex_result = simex(nls_fit_unweighted, SIMEXvariable = "x_err", measurement.error = 0.1, asymptotic = F)

# 基于校正后的参数重新计算权重并拟合
corrected_params = coef(simex_result)
y_fit_corrected = 100/(1+10^((log10(corrected_params["k"])-x_err)*corrected_params["h"]))
w_corrected = y_fit_corrected^-2
final_fit = nls(y_het ~ 100/(1+10^((log10(k)-x_err)*h)), start = corrected_params, weights = 1/w_corrected)

方法2:用nlme处理异方差(更兼容)

nlme包的gnls()函数可以原生建模异方差结构,且simex对gnls模型的支持更好,无需拆分步骤:

library(nlme)
# 拟合带异方差的gnls模型(用拟合值的幂函数定义方差)
gnls_fit = gnls(y_het ~ 100/(1+10^((log10(k)-x_err)*h)), 
                start = list("k" = 100, "h" = 0.75),
                weights = varPower(form = ~fitted(.)))
# 直接应用simex校正测量误差
simex_gnls = simex(gnls_fit, SIMEXvariable = "x_err", measurement.error = 0.1, asymptotic = F)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:30:51