【问题标题】:Why doesn't R unique() work with fitted values extracted from lm() objects?为什么 R unique() 不适用于从 lm() 对象中提取的拟合值?
【发布时间】:2018-04-25 01:05:56
【问题描述】:

Unique 查找向量的唯一值。

如果我有一个数据框:

test_data <- data.frame(x = c(rep(1.00050239485720394857,4),
                              1.00050239485720394854,rep(2.0002230948570293845,5),rep(3.0005903847502398475,5)),
                        y = c(rep(4.00423409872345,5),rep(2.034532039485722,5),rep(1.1234152304957,5)))
sapply(test_data,unique)

R 返回:

            x        y
[1,] 1.000502 4.004234
[2,] 2.000223 2.034532
[3,] 3.000590 1.123415

正如预期的那样。

但是假设我拟合了一个 lm() 或 aov() 对象,然后尝试找到唯一的拟合值():

set.seed(123)

y = rf(100,50,3,3)
x1 <- factor(c(rep("blue",25),
               rep("green",25),
               rep("orange",25),
               rep("purple",25)))

bsFit <- aov(y ~ x1)
unique(bsFit$fitted.values) 

R 返回:

 [1] 2.709076 2.709076 2.709076 2.709076 2.709076 2.709076
 [7] 2.709076 4.060080 4.060080 4.060080 4.060080 3.314801
[13] 3.314801 3.314801 3.314801 1.960280 1.960280 1.960280
[19] 1.960280 1.960280

这里明显有重复。

【问题讨论】:

  • 浮点运算在 R 或大多数其他语言中并不精确。我的猜测是,似乎出现了 7 次的“重复”值 2.709076 实际上与引擎盖下的值不同。
  • R 只显示句号右侧的 6 位数字。
  • 我相信我已经更新了我的问题以反映您的 cmets @TimBiegeleisen
  • @JeromeDineen 可能在圆括号中放错了括号?
  • unique(round(bsFit$fitted.values,6)) 成功了

标签: r unique anova


【解决方案1】:

正如其他人所说(尤其是@Tim-Biegeleisen),RStudio 正在将输出格式化为特定的小数位数(记住打印到控制台的任何内容都由 RStudio 格式化)。因此,如果格式正确以显示所有小数位,则“重复项”不是重复项。

我们可以使用format 来显示所有小数位:

format(unique(bsFit$fitted.values), digit = 22)
 [1] "2.7090760788376542" "2.7090760788376773" "2.7090760788376604" "2.7090760788376622" "2.7090760788376627"
 [6] "2.7090760788376649" "2.7090760788376640" "4.0600797479202155" "4.0600797479202164" "4.0600797479202200"
[11] "4.0600797479202146" "3.3148005388803132" "3.3148005388803128" "3.3148005388803146" "3.3148005388803137"
[16] "1.9602804435309986" "1.9602804435309984" "1.9602804435309982" "1.9602804435309988" "1.9602804435310004

我尝试了抛出错误之前的位数,得到 22。

【讨论】:

  • @jerome 也许我误解了你,但这似乎与浮点问题根本不矛盾
猜你喜欢
  • 1970-01-01
  • 2018-02-07
  • 2015-05-24
  • 2019-07-12
  • 1970-01-01
  • 2015-10-04
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多