【问题标题】:Find outlier using z score使用 z 分数查找异常值
【发布时间】:2015-03-04 23:09:39
【问题描述】:

我正在尝试在 R 中创建一个函数。该函数应该使用 z 分数从矩阵中找出异常值。该函数应该有两个参数作为输入(x 是一个矩阵,zs 是一个整数)。对于矩阵的每个原始值,该函数应计算每个元素的 zscore,如果 zscore 大于 zs 或小于 -zs,则该函数应打印该元素。我知道我可以使用:

z<- (x-mean(x))/sd(x)   or  z<- scale(x) 

对于z分数的计算,但由于我是编程初学者,我发现由于矩阵的原因很难解决这个问题。

【问题讨论】:

    标签: r outliers


    【解决方案1】:

    这段代码怎么样:

    set.seed(1)
    mat <- matrix(rnorm(100), ncol=10)
    temp <- abs(apply(mat, 1, scale))
    mat[temp > 2]
    ### [1]  1.9803999  0.2670988 -1.2765922
    

    我为您的 Z 限制采用了 2 个标准差。 首先我创建一个随机矩阵。 然后我逐行缩放它(应用函数的'1'参数) 我应用'abs'以避免必须在两侧()进行测试,因为测试是对称的 最终它会给你异常值。但是您可能还想查看它们的位置,只需执行以下操作:

    image(temp > 2)
    

    编辑:如果您需要它作为输入 x 和 zs 的函数,我将其包装起来:

    outliers = function(x, zs) {
      temp <- abs(apply(x, 1, scale))
      return(x[temp > zs])
    }
    
    ### > outliers(matrix(rnorm(100), ncol=10), 2)
    ### [1]  1.9803999  0.2670988 -1.2765922
    

    【讨论】:

    • 您好,感谢您的即时帮助。我需要的是用户应该输入 x(矩阵)和 zs,并且函数应该返回异常值(zscore>zs 或 zscore
    • @Alan “应该返回异常值”是什么意思?您想要它们的值列表,或者您想要它们的位置行/列,或者可能只是带有 TRUE/FALSE 的初始矩阵?请说明
    • 它们的值列表。谢谢
    • 感谢您的回复。让我检查一下我是否正确理解了您的代码。我们使用输入 x 和 zs 创建函数异常值。我们创建一个变量 temp,它计算 x 的每一行的 z 分数的绝对值。然后我们的函数返回大于 zs 的 zscores 的值。对?在您的示例中, x 是一个包含 100 个随机值和 10 列的矩阵。 zs=2。对?那么既然必须返回zs以上的值,为什么返回的是1.9803999 0.2670988 -1.2765922呢?谢谢
    • 你做对了。对于“为什么返回值不高于 2”的问题,只是因为缩放:不要忘记异常值是初始矩阵中的值,而不是缩放矩阵!
    【解决方案2】:
    myfun <- function(x, zs) { 
        x1 <- apply(x, 1, scale)
        x2 <- (abs(x1) - abs(zs)) > 0
        return(x * x2)
    }
    

    【讨论】:

    • 嗨。谢谢你的帮助。所以我猜用户可以输入x(矩阵)和zs。然后 x1 获取每一行并缩放元素 ???那么如果 x1 (zscore) - zs>0 那么为什么它返回 x*x2?另外,所以问,我知道这是一个愚蠢的问题,但我如何插入数据?我的乐趣(我应该包括什么)?谢谢
    • 按单元格乘以 True/False 矩阵 (x2) 会得到一个与原始矩阵 x 具有相同维度的矩阵,原始矩阵的所有值都符合“离群值”标准。您可以通过运行outliers &lt;- myfun(x=yourmatrix, zs=yourz) 来使用此功能,其中your 代表您要使用的任何输入值。
    猜你喜欢
    • 2023-01-19
    • 2021-09-05
    • 2020-09-28
    • 2018-05-01
    • 1970-01-01
    • 2017-11-23
    • 2020-06-04
    • 2020-01-17
    • 2015-03-13
    相关资源
    最近更新 更多