【发布时间】:2020-09-06 14:38:33
【问题描述】:
我从另一个工人那里收到了一个函数,用于计算一棵树在 100 岁 (SI) 时达到特定高度所需的高度。我的工作是将其放入 purrr 中,以计算一些 SI 和高度交叉点的高度,以绘制增长轨迹。
首先我创建基础函数:
SI_tall <- function(topheight, age, si ){
paramasi <- 25
parambeta <- 7395.6
paramb2 <- -1.7829
refAge <- 100
d <- parambeta*(paramasi^paramb2)
r <- (((topheight-d)^2)+(4*parambeta*topheight*(age^paramb2)))^0.5
## height at reference age
h2 <- (topheight+d+r)/ (2+(4*parambeta*(refAge^paramb2)) / (topheight-d+r))
return(abs(h2 - si))
}
要计算给定年龄和站点索引的树的高度,我们在另一个中使用此函数。高度将由
给出my.age <- 10
my.si <- 30
new.topheight <- function(my.si, my.age){
optim(par = list(topheight = 10), ## this topheight is just an initial value
method = 'L-BFGS-B', fn = SI_tall, si = my.si, age = my.age, lower= 0, upper=100)$par
}
这适用于每个值。 由于我想绘制每棵树的生长轨迹,我首先需要以所需的分辨率计算年龄和站点索引以进行绘图。我创建了两个要交叉的向量:
my.age <- seq(0,110, by=0.2)
my.si <- c(5,10,15,20,25,30,35)
si.crossing <- tidyr::crossing(my.age, my.si)
si.crossing %>% group_by(my.age, my.si) %>%
nest() %>%
mutate(topheight = map2(.x=my.age, .y=my.si, .f=~new.topheight(my.si=.y, my.age=.x)))
这是我得到的错误:
优化错误(par = list(topheight = 30), method = "BFGS", fn = SI_tall, : 'vmmin' 中的初始值不是有限的
怎么了?非常感谢。
【问题讨论】:
标签: r function dplyr tidyr purrr