使用uniroot函数将额外的参数传递给lapply()时遇到问题

时间:2019-11-21 12:09:31

标签: r math regression

所以我试图用uniroot()查找Y的特定值的根。我将它们全部放在数据帧的一列中,我想创建一个新列,并通过lapply()为原始列的每个Y查找根。 我创建uniroot作为自变量以查找其根的函数的方式是,将Y值减去该函数的最后一个系数,然后将该Y值作为附加参数传递给uniroot(根据uniroot帮助页面)。

几个小时后,我试图弄清正在发生的事情,我意识到lapply()传递给函数的值是Y,但是它被读为uniroot内部的“ interval”参数,因此给我带来了错误论点。

我想我可以用另一种方法来实现,但是如果这种方法有解决方案,那会更好,更简单。

pol_mod <- lm(abs_p ~ poly(patron, 5, raw = TRUE), data = bradford)

a <- as.numeric(coefficients(pol_mod)[6])
b <- as.numeric(coefficients(pol_mod)[5])
c <- as.numeric(coefficients(pol_mod)[4])
d <- as.numeric(coefficients(pol_mod)[3])
e <- as.numeric(coefficients(pol_mod)[2])
f <- as.numeric(coefficients(pol_mod)[1])

fs <- function (x,y) {a*x^5 + b*x^4 + c*x^3 + d*x^2 + e*x + f - y}

interpol <- function (y, fs) {
    return(uniroot(fs,y=y, interval=c(0,2000)))
}

bradford$concentracion <- lapply(bradford$abs_m, interpol, fs=fs)

我得到的错误:

Error in uniroot(fs, y = y, interval = c(0, 2000)) : 
  f.lower = f(lower) is NA

不用说,在lapply()之外应用时一切正常

如果有人可以伸出援手,我会非常高兴!预先感谢!

编辑:这是数据框的外观。

bradford
# A tibble: 9 x 3
  patron abs_p  abs_m
   <dbl> <dbl>  <dbl>
1      0 0      1.57 
2     25 0.041  1.27 
3    125 0.215  1.59 
4    250 0.405  1.61 
5    500 0.675  0.447
6    750 0.97   0.441
7   1000 1.23  NA    
8   1500 1.71  NA    
9   2000 2.04  NA

0 个答案:

没有答案