【问题标题】:Box-Cox Tranformation Error: object 'x' not foundBox-Cox 转换错误:找不到对象“x”
【发布时间】:2020-05-12 06:35:32
【问题描述】:

希望对于那些比我更有经验的人来说是一个相对容易的!

尝试使用以下代码执行 Box-Cox 转换:

fit <- lm(ABOVEGROUND_BIO ~ TREATMENT * P_LEVEL, data = MYCORRHIZAL_VARIANCE)
bc <- boxcox(fit)
lambda<-with(bc, x[which.max(y)])
MYCORRHIZAL_VARIANCE$bc <- ((x^lambda)-1/lambda)
boxplot(bc ~ TREATMENT * P_LEVEL, data = MYCORRHIZAL_VARIANCE)

但是当我运行它时,我收到以下错误消息:

Error: object 'x' not found. (on line 4)

对于上下文,这是我的数据集的 str:

Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    24 obs. of  14 variables:
 $ TREATMENT             : Factor w/ 2 levels "Mycorrhizal",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ P_LEVEL               : Factor w/ 2 levels "Low","High": 1 1 1 1 1 1 2 2 2 2 ...
 $ REP                   : int  1 2 3 4 5 6 1 2 3 4 ...
 $ ABOVEGROUND_BIO       : num  7.5 6.8 5.3 6 6.7 7 12 12.7 12 10.2 ...
 $ BELOWGROUND_BIO       : num  3 2.4 2 4 2.7 3.6 7.9 8.8 9.5 9.2 ...
 $ ROOT_SHOOT            : num  0.4 0.35 0.38 0.67 0.4 0.51 0.66 0.69 0.79 0.9 ...
 $ ROOT_SHOOT.log        : num  -0.916 -1.05 -0.968 -0.4 -0.916 ...
 $ ABOVEGROUND_BIO.log   : num  2.01 1.92 1.67 1.79 1.9 ...
 $ ABOVEGROUND_BIO.sqrt  : num  2.74 2.61 2.3 2.45 2.59 ...
 $ ABOVEGROUND_BIO.cubert: num  1.96 1.89 1.74 1.82 1.89 ...
 $ BELOWGROUND_BIO.log   : num  1.099 0.875 0.693 1.386 0.993 ...
 $ BELOWGROUND_BIO.sqrt  : num  1.73 1.55 1.41 2 1.64 ...
 $ BELOWGROUND_BIO.cubert: num  1.44 1.34 1.26 1.59 1.39 ...
 $ TOTAL_BIO             : num  10.5 9.2 7.3 10 9.4 10.6 19.9 21.5 21.5 19.4 ...
 - attr(*, "spec")=
  .. cols(
  ..   TREATMENT = col_factor(levels = c("Mycorrhizal", "Non-mycorrhizal"), ordered = FALSE, include_na = FALSE),
  ..   P_LEVEL = col_factor(levels = c("Low", "High"), ordered = FALSE, include_na = FALSE),
  ..   REP = col_integer(),
  ..   ABOVEGROUND_BIO = col_number(),
  ..   BELOWGROUND_BIO = col_number(),
  ..   ROOT_SHOOT = col_number()
  .. )

我知道 MYCORRHIZAL_VARIANCE 数据集中没有名为 bc 的变量,但我只是按照给我的执行 Box-Cox 的基本说明进行操作,我想我对实际应该表示的“x”感到困惑因为我认为'x'是在第3行定义的?有关如何修复此错误的任何建议?

提前致谢!

【问题讨论】:

  • x 似乎在 bc 内,请在第 4 行尝试 bc$x
  • 不幸的是,我也收到了同样的错误信息!还有其他建议吗?
  • 嗯,不幸的是 bc$x 正在返回错误消息 Error: object 'x' not found。我应该将“x”或“y”定义为响应变量还是预测变量?我一直在使用手册中有关如何执行转换的以下内容,如果这可以解决任何问题? BOXCOX 转换install.packages("MASS") # install library from web library(MASS) # load library fit &lt;-lm(RESPONSE~TREATMENT,data=yourdata) bc &lt;- boxcox(fit) lambda&lt;-with(bc, x[which.max(y)]) yourdata$bc &lt;- ((x^lambda)-1)/lambda) boxplot(bc ~ TREATMENT, data = yourdata)

标签: r lambda statistics transform mass-package


【解决方案1】:

我认为'x' 是在第 3 行定义的?

第 3 行是lambda&lt;-with(bc, x[which.max(y)])。它没有定义x,它定义了lambda。它确实使用 x,它会在bc 环境中 寻找它。如果您使用的是 MASS 包中的 boxcox()bc 确实应该包含 xy 组件,因此 bc$x 不应该给您 same 错误消息.我预计替换长度会出错。因为……

bc$xboxcox 尝试的潜在 lambda 值 - 您使用的是默认的 seq(-2, 2, 1/10),如果您的数据有 41 行的倍数需要在将 41 个值分配给新列。

第 3 行挑选出使可能性最大化的 lambda 值,因此您不再需要 bc 中的其余值。我希望您使用lambda 值来转换您的响应变量,如that's what the Box Cox transformation is for((x^lambda)-1/lambda) 没有任何统计或程序意义。改用这个:

MYCORRHIZAL_VARIANCE$bc <- (MYCORRHIZAL_VARIANCE$ABOVEGROUND_BIO ^ lambda - 1) / lambda

(请注意,我还更正了括号。你想要(y ^ lambda - 1) / lambda,而不是(y ^ lambda) - 1 / lambda。)

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 2022-08-23
    • 1970-01-01
    • 2022-01-06
    • 2013-11-18
    • 2012-11-02
    • 2014-12-24
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多