修复要为x:y而不是仅1:y运行的函数

塞斯帕克

我定义了一个函数,该函数根据从2种出版物中提取的方程式来计算树木的高度(h)和直径(dbh)之间的关系。我的目标是使用论文1(Xiangtao)中建立的关系来预测论文2(Marechaux和Chave)中方程式的变量值。我想测试一下纸张2[x:y]的生成nls()曲线适合纸张1的直径范围。目前,我一直遇到错误(我相信plot()

Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths differ

如果我用任何东西,除了X = 1[x:y]dbh.min:dbh.max

我的功能如下:

# Plant.Functional.Type constants...
Dsb1 <- 2.09
Dsb2 <- 0.54
Db1 <- 0.93
Db2 <- 0.84
BDb1 <- 2.66
BDb2 <- 0.48
Eb1 <- 1.41
Eb2 <- 0.65
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Generate.curve <- function(b1, b2, dbh.min, dbh.max){
# calculate Xiangtao's allometry...
  tmp_h <- c(dbh.min:dbh.max)
  for (dbh in dbh.min:dbh.max)
  {
    h = b1*dbh^(b2)
    tmp_h[dbh] = h
  }
# plot to check curve
  plot(dbh.min:dbh.max, tmp_h)

# define secondary function for Marechaux and Chave allometry
  h_fxn <- function(hlim,dbh,ah){
    h = hlim * (dbh / (dbh + ah))
    return(h)
  }

# use nonlinear least squares model to solve for ah and hlim
  # set model inputs
  start.ah <- 1 
  start.hlim <- 5
  tmp_v <- cbind(dbh.min:dbh.max,tmp_h)

tmp.fit <- nls(tmp_h ~ h_fxn(hlim,dbh.min:dbh.max,ah), start = list(hlim = start.hlim, 
                ah = start.ah), algorithm = "port", upper = list(hlim = 75, ah = 99))  
# seems to be no way of extracting ah and hlim from tmp.fit via subset
# extract manually and then check fit with
  # lines(dbh.min:dbh.max, hlim * (dbh.min:dbh.max/(dbh.min:dbh.max + ah)))
  # for equation h = hlim * (dbh / (dbh + ah)) from Marechaux and Chave
return(tmp.fit)
}
# # # # # # # # # # # # # # # # # # # # # # # # # # #

这非常适合

Generate.curve(Dsb1,Dsb2,1,100)
lines(1:100, 36.75 * (1:100/(1:100 + 52.51)))

但是我也希望能够检查诸如此类范围内的曲线拟合[80:100]我一直在尝试找出为什么现在Generate.curve(Dsb1,Dsb2,80,100)返回错误大约3天。谢谢你的帮助。

艾伦·卡梅伦

您的问题出在以下部分:

  tmp_h <- c(dbh.min:dbh.max)
  for (dbh in dbh.min:dbh.max)
  {
    h = b1*dbh^(b2)
    tmp_h[dbh] = h
  }

考虑一下将其设置dbh.min为80和dbh.max100时会发生什么

  tmp_h <- 80:100
  for (dbh in 80:100)
  {
    h = b1*dbh^(b2)
    tmp_h[dbh] = h
  }

在循环的第一个周期会发生什么?好,tmp_h长度是20,但是在第一个循环中,长度dbh是80,并且您要为分配一个数字tmp_h[dbh],即tmp_h[80]到循环结束时,tmp_h将存储正确的值,但它们将在index中80:100因此,tmp_h将在前21个索引中存储数字80:100,然后存储一堆NA,然后在后21个索引中存储正确的数字。

因此将其更改为:

  tmp_h <- c(dbh.min:dbh.max)
  for (dbh in dbh.min:dbh.max)
  {
    h = b1*dbh^(b2)
    tmp_h[dbh - dbh.min + 1] = h
  }

它会工作。

但是,由于R使用向量化运算,因此实际上您根本不需要循环,因此整个部分都可以替换为:

tmp_h <- b1 * (dbh.min:dbh.max)^(b2)

然后当你做

Generate.curve(Dsb1,Dsb2,80,100)
lines(80:100, 36.75 * (80:100/(80:100 + 52.51)))

你得到这个:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅使用按位运算符,使函数在x <= y时返回1

X不是Y的成员类型

屏蔽Y数组以仅获取X1 == X2的值

如何修复自定义 ggplot2 函数中的“替换有 [x] 行,数据有 [y]”错误?

(x不是None)和(y不是None)和(x和y)的python区别不是None

For Each byref x in y - 而不是 byval

[] .concat([“ x”,“ y”],“ z”)->如何获取[[“ x”,“ y”],“ z”]而不是[“ x”,“ y”, “ z”]?

setdiff(x,y)错误:仅在x中而不是y中返回x而不是值

x,y 计算产生 3,3 而不是 1,2

不是这样吗?Python x>y "<stdin>",第 1 行和语法错误

如何修复 - ArrowInvalid: (“无法使用元组类型转换 (x, y))?

如何修复“'X'对象没有属性'y'”

如何修复 ValueError: x 和 y 必须是相同的大小?

Maxima 不使用求解函数求解系统 sqrt(x)=1, y=1

当x-> y和z-> y(其中z不是x的子集)时,FD(函数相关性)是否完全fd?

Matplotlib修复y轴

(x % y) 和 (x & (y-1)) 等价吗?

{condition 1: x(), condition 2: y()}.get(True, None) 如何在 python 中实际运行?

如何与另一个主机Y中的主机X中正在运行的Docker容器通信(而不是与主机Y中的容器通信)

Python函数参数([x [,y [,z]]])的含义

在Python中使用slice(x,y)函数

倒数似乎坏了... 1/y == y (但 y 是明确定义的,而不是 1)

从定义一个函数f1(x)的对象的另一函数F0(X,Y),但设置y以一个固定的值c ++

如何修复 .addEventListener 不是函数

如何修复“ ...不是函数”错误?

Scala错误:X值不是Y的成员->尽管在默认构造函数中进行了声明,但仍不可见

错误“战术失败:关系(有趣的 xy : BloodType => x <> y)不是声明的自反关系。” 证明函数定理时

如何修复两次运行函数但仅被调用一次的Enter键的keypress事件

如何使函数仅与每个克隆的 div 单独运行,而不是与原始 div 一起运行