lm() 线性化指数回归与非线性 nls() 回归

机器算法验证 r 回归 线性模型
2022-04-03 17:17:33

免责声明

我是这个网站的新手,对 R 相对较新(两周的学习),只有非常基础的统计学知识,如果我在那里犯了一个愚蠢的错误或问了不好的问题或其他什么,我很抱歉。

我也不知道如何很好地将我的数据集嵌入到帖子中(我搜索了元数据但没有找到任何相关信息)所以我分享了来自 Google Drive 的链接(如果你知道更好的方法,请告诉我,我可以更改它或如果您有权编辑,请自行执行)。

解释

在我参加的物理实验室课程中,我做了一个实验,使用不同厚度的滤光片确定光学介质的衰减系数(使用此光谱仪http://www.vernier.com/products/sensors/spectrometers/visible-range/ v-规范/)。

它生成的数据可以在这里下载以重现我的结果:https ://docs.google.com/uc?authuser=0&id=0B5x0REqWCRBuaHlXc2JWZ19sWE0&export=download

我的目标是确定,其中是衰减系数和波长,使用 Beer-Lambert 定律,其中规定(是厚度): κ(λ)κλl

θ=x0exp(κl)

对于不同厚度的滤光片(从 1 到 5 mm),我有 5 条“曲线”,并且我拟合了每个波长的指数模型,这给了我该λκ

我试过这个:

线性化模型

通过对上述方程取对数和一些代数运算,我们得到:

ln(x0θ)=κl

由 R 命令表示lm( I(log(x0/temp.theta)) ~ l + 0 )

非线性模型

我采用 Beer-Lambert 定律(第一个方程)并将其建模为nls(temp.theta ~ I(x0 * exp(-k*l)) + 0 , start= list(k = k.l)),其中 是从线性化模型中获得的k.l = coef(lm(...))

复制代码

我设置了x0 = 100因为是用百分比来衡量的。θ

x0 = 100 #x=0 intercept of the exp function

data = read.delim2("export2.csv")

l = data$l
l = l[-which(is.na(l))]
data$l = NULL

data$kappa.l = NA
data$sd.l = NA
data$kappa.nl = NA
data$sd.nl = NA

for(i in 1:nrow(data)){

  temp.theta = as.numeric(data[i,-which(names(data) %in% c("lambda","kappa.l","kappa.nl","sd.l","sd.nl"))])
  temp.lm = lm( I(log(x0/temp.theta)) ~ l + 0 )
  k.l = coef(temp.lm)
  data[i , "kappa.l"] = k.l
  data[i , "sd.l"] = coef(summary(temp.lm))[ ,"Std. Error"]

  temp.nls = nls(temp.theta ~ I(x0 * exp(-k*l)) + 0,  start = list(k = k.l))
  data[i , "kappa.nl"] = coef(temp.nls)
  data[i , "sd.nl"] = coef(summary(temp.nls))[ ,"Std. Error"]

}

问题

当我可视化结果时,我得到下面的图表。出现了这些问题:

  • 为什么在 400 nm 波长附近的拟合差异如此之大?
  • 哪一个更适合数据?
  • 或者数据是否远离指数行为,所以我必须在它们相遇的地方削减它们?
  • 这些模型中哪一个在统计上(更)正确?
  • 我可以通过根据测量不确定性(我认为 Vernier 网上所述的 5%)添加权重来使拟合更好吗?

具有较高值的​​拟合是非线性的 卡帕(λ)

1个回答

正如我在免责声明中所说,这是一个愚蠢的错误。如果我绘制了实际数据,那么为什么模型不适合(因为任何其他此类指数模型都不适合)就会变得很明显。

这可能是光谱仪的问题,因为它可能不够灵敏,无法捕捉到低透光率,因此所有五次测量实际上都为零,因此拟合指数曲线是没有意义的。

我很抱歉浪费你们的时间伙计们。

数据可视化 细节