【问题标题】:Understanding `scale` in R了解 R 中的“比例”
【发布时间】:2013-12-13 21:29:11
【问题描述】:

我试图理解 R 提供的scale 的定义。我有想要制作热图的数据 (mydata),并且存在非常强的正偏差。我为scale(mydata)log(my data) 创建了一个带有树状图的热图,两者的树状图都不同。为什么?缩放我的数据和对数转换我的数据意味着什么?如果我想查看说明数据列之间关系的树状图,哪个更合适?

感谢您的帮助!我已经阅读了定义,但它们在我脑海中挥之不去。

【问题讨论】:

    标签: r scale transformation heatmap


    【解决方案1】:

    log 只取向量的每个元素的对数(默认为e)。
    scale,在默认设置下,将计算整个向量的均值和标准差,然后通过减去平均值并除以标准差来“缩放”每个元素。 (如果使用scale(x, scale=FALSE),只会减去均值,不会除以标准差。)

    请注意,这将为您提供相同的值

       set.seed(1)
       x <- runif(7)
    
       # Manually scaling
       (x - mean(x)) / sd(x)
    
       scale(x)
    

    【讨论】:

    • 感谢您的回答!但是 scale() 的意义是什么?我使用它的理由是什么(它使数据看起来更好,等等)。我只是想了解 scale() 的“点”。谢谢!
    • scale 在您考虑跨不同尺度的多个变量时更有意义。例如,一个 var 的数量级为 100,而另一个 var 的数量级为 1000000
    • @Jen:另一种(非常失败的)思考方式:使用scale 时,您不会更改数据,而是更改比例(绘图时的轴值)。想想在两端抓住轴并拉伸或压缩它。那就是规模。相反,log 实际上更改了数据。 log 的影响对于较大的值“更强”,而对于较小的值则更小。
    • @@Ricardo Saporta,哦,好的,谢谢,这很有道理!尤其是查看具有不同尺度的多个变量的想法,这对我来说简直太棒了!非常感谢!
    • @RicardoSaporta 那些公式不一样!我只是看看他们
    【解决方案2】:

    它只提供数据的标准化。它创建的值有几个不同的名称,其中之一是 z-scores(“Z”,因为正态分布也称为“Z 分布”)。

    更多信息可以在这里找到:

    http://en.wikipedia.org/wiki/Standard_score

    【讨论】:

      【解决方案3】:

      这是一个较晚的添加,但我自己正在寻找有关比例功能的信息,尽管它也可能对其他人有所帮助。

      稍微修改来自Ricardo Saporta的响应。
      使用标准差进行缩放,至少在 R 的 3.6.1 版本中没有,我基于“Becker, R. (2018)。新的 S 语言。 CRC 出版社。”和我自己的实验。

      X.man.scaled <- X/sqrt(sum(X^2)/(length(X)-1))
      X.aut.scaled <- scale(X, center = F)
      

      这些行的结果是完全相同的,因为简单,我没有居中显示它。

      我会在评论中回复,但没有足够的声誉。

      【讨论】:

      • 来自 scale 的文档:“scale 的值决定了列缩放的执行方式(居中后)。如果 scale 是一个类似数字的向量,其长度等于x 的列数,然后 x 的每一列除以来自 scale 的相应值。如果 scale 为 TRUE,则缩放是通过将 x 的(居中)列除以它们的标准偏差(如果 center 为 TRUE)和根均值否则为正方形。如果 scale 为 FALSE,则不进行缩放。这意味着您的公式是正确的因为您没有先居中
      【解决方案4】:

      我想我会通过提供一个实际使用比例函数的具体示例来做出贡献。假设您有 3 个要比较的考试成绩(数学、科学和英语)。也许您甚至可能希望根据每个观察的 3 个测试中的每一个生成一个综合分数。您的数据可能如下所示:

      student_id <- seq(1,10)
      math <- c(502,600,412,358,495,512,410,625,573,522)
      science <- c(95,99,80,82,75,85,80,95,89,86)
      english <- c(25,22,18,15,20,28,15,30,27,18)
      df <- data.frame(student_id,math,science,english)
      

      显然,比较这 3 个分数的平均值是没有意义的,因为分数的规模有很大的不同。但是,通过缩放它们,您可以获得更多可比较的评分单位:

      z <- scale(df[,2:4],center=TRUE,scale=TRUE)
      

      然后,您可以使用这些缩放结果来创建综合得分。例如,平均这些值并根据该平均值的百分位数分配一个等级。希望这有帮助!

      注意:我从“R In Action”一书中借用了这个例子。这是一本很棒的书!肯定会推荐。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多