# Jitter R function equivalent in Julia?

**URL:** <https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457>\
**Category:** New to Julia\
**Tags:** question, plotting, r\
**Created:** [July 22, 2020, 12:00am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457 "2020-07-22T00:00:38Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![pauloat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauloat/32/16517_2.png) [@pauloat](https://discourse.julialang.org/u/pauloat)\
**Post date:** [July 22, 2020, 12:00am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/1 "2020-07-22T00:00:38Z")

</div>

hi, I wanted to know if there’s an equivalent function to R’s [jitter()](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/jitter) that add noise to a value or vector of values.

Thanks you.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [July 22, 2020, 12:48am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/2 "2020-07-22T00:48:24Z")

</div>

IIUC the noise is just flat? you can do something like this:

```julia
julia> function jitter!(a::Array, factor=1.0)
           @assert eltype(a) <: AbstractFloat
           a .+= rand(size(a)...) .* factor
       end
jitter! (generic function with 2 methods)

julia> a = [1,2,3.0]
3-element Array{Float64,1}:
 1.0
 2.0
 3.0

julia> jitter!(a)
3-element Array{Float64,1}:
 1.1695643269414993
 2.8603620667109464
 3.398111259109001

```

---

<div class="post-metadata">

**Author:** ![pauloat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauloat/32/16517_2.png) [@pauloat](https://discourse.julialang.org/u/pauloat)\
**Post date:** [July 22, 2020, 1:16am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/3 "2020-07-22T01:16:59Z")

</div>

Thanks, I also tried to replicate the function using the documentation of R as follow:

```julia
function jitter(x)
    z = findmax(collect(skipmissing(x)))[1] - findmin(collect(skipmissing(x)))[1]
    a = z/50
    if a == 0
        x = x .+ rand(length(x))
        return x
    else
        x = x .+ rand(Uniform(-a, a), length(x))
        return x
    end
end

```

is working fine.

btw, your version give me the next error

`**AssertionError: eltype(a) <: AbstractFloat**`

when I try to pass a “Vector{Union{Missing, Int64}}” object, using collect(skipmissing()) to clean the missing values, that is a “Vector{Int64}” give me the same error.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [July 22, 2020, 1:21am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/4 "2020-07-22T01:21:59Z")

</div>

that is because my function tries to do in-place operation, and a `Integer` Vector obviously cannot jitter (unless you want to jitter in integer intervals).

I realize R’s jitter doesn’t something more complex (as your function implements them), so it’s good you got it working.

For your function, I’d suggest make use of `extrema(skipmissing(x))`, and replace `length` with `size(x)...` so it also works on higher dimension array

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [July 22, 2020, 1:26am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/5 "2020-07-22T01:26:41Z")

</div>

You can actually go 1 step better and just do `x = x .+rand.()` or `x = x .+ rand.(Uniform(-a,a))` which will broadcast the `rand` call to the right length automatically.

---

<div class="post-metadata">

**Author:** ![pauloat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauloat/32/16517_2.png) [@pauloat](https://discourse.julialang.org/u/pauloat)\
**Post date:** [July 22, 2020, 1:27am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/6 "2020-07-22T01:27:06Z")

</div>

Thanks, I implement your recommendations.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [July 22, 2020, 1:36am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/7 "2020-07-22T01:36:17Z")

</div>

now I want to know how is this implemented and how to customize the `@.` fusion behavior for our functions

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [July 22, 2020, 1:39am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/8 "2020-07-22T01:39:09Z")

</div>

The really cool thing about how broadcasting works in Julia is that this isn’t specially implimented by `rand`, and works for any scalar function.

---

<div class="post-metadata">

**Author:** ![dmoored4](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dmoored4/32/18311_2.png) [@dmoored4](https://discourse.julialang.org/u/dmoored4)\
**Post date:** [July 25, 2021, 3:29am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/9 "2021-07-25T03:29:48Z")

</div>

FWIW, this is what I used and I like it because I don’t have to create a “jittered” vector to plot. Assuming I have two vectors I want to plot, x and y:

```nohighlight
jitter(n::Real, factor=0.1) = n + (.5 - rand()) * factor

plot(x, jitter.(y))

```

---

<div class="post-metadata">

**Author:** ![HerAdri](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/heradri/32/5816_2.png) [@HerAdri](https://discourse.julialang.org/u/HerAdri)\
**Post date:** [July 25, 2021, 8:45am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/10 "2021-07-25T08:45:19Z")

</div>

```julia
function jitterR(x)

    z =abs(-(extrema(skipmissing(x))...))

    a = z/50

    if a == 0

        x = x .+ rand(size(x,1))

        return x

    else

        x = x .+ rand(Uniform(-a, a),size(x,1))

        return x

    end

end

@. jitterR(a)

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [July 25, 2021, 3:09pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/11 "2021-07-25T15:09:48Z")

</div>

I would suggest using `rand(typeof(n))` to avoid having numbers converted to `Float64`, if you are originally using a different number type.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [July 25, 2021, 3:10pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/12 "2021-07-25T15:10:35Z")

</div>

> [@HerAdri](#):
>
> `@. jitterR(a)`

Now you are broadcasting both inside and outside the function, which isn’t very useful.

---

<div class="post-metadata">

**Author:** ![bdeonovic](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdeonovic/32/3928_2.png) [@bdeonovic](https://discourse.julialang.org/u/bdeonovic)\
**Post date:** [August 2, 2021, 3:56pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/13 "2021-08-02T15:56:01Z")

</div>

It would be nice to have a julia verison of quasirandom jitter (jitter plots so they correspond with a density estimate)

> **[geom\_quasirandom function - RDocumentation](https://www.rdocumentation.org/packages/ggbeeswarm/versions/0.5.3/topics/geom_quasirandom)**
>
> \<p\>The quasirandom geom is a convenient means to offset points within categories
> to reduce overplotting. Uses the vipor package\</p\>

---

<div class="post-metadata">

**Author:** ![sidpatil](https://avatars.discourse-cdn.com/v4/letter/s/85f322/32.png) [@sidpatil](https://discourse.julialang.org/u/sidpatil)\
**Post date:** [August 2, 2021, 4:02pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/15 "2021-08-02T16:02:05Z")

</div>

For your first example, you can simplify it even further and write `x .+= rand.()`, or also `@. x += rand()`.

---

<div class="post-metadata">

**Author:** ![dlakelan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlakelan/32/8491_2.png) [@dlakelan](https://discourse.julialang.org/u/dlakelan)\
**Post date:** [August 2, 2021, 5:05pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/16 "2021-08-02T17:05:39Z")

</div>

Is there a package that implements this as well as lots of other useful stats functions? For example StatsFuns.jl doesn’t do it. But maybe it should? Or is there another package that does it?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [August 3, 2021, 8:47am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/17 "2021-08-03T08:47:13Z")

</div>

> [@bdeonovic](#):
>
> quasirandom jitter (jitter plots so they correspond with a density estimate)

Can you explain how that works? I don’t understand it from the docs you linked.

---

<div class="post-metadata">

**Author:** ![bdeonovic](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdeonovic/32/3928_2.png) [@bdeonovic](https://discourse.julialang.org/u/bdeonovic)\
**Post date:** [August 3, 2021, 3:33pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/18 "2021-08-03T15:33:31Z")

</div>

Here is a MWE

```julia
using Plots
using StatsPlots
using KernelDensity

y = randn(100*3)
x=repeat(1:3, inner=[100])
y[x.==1] .= randn(100).*0.25

barwidth = 0.8 
width= 0.5 * barwidth

ngroups = length(unique(x))

k = Array{UnivariateKDE}(undef, ngroups)
for i in 1:ngroups
	k[i] = kde(y[x .== i])
end
max_dens = map(x-> maximum(x.density), k)

x_jitter = x .+ width./max_dens[x] .* rand(length(x)) .* pdf.(k[x], y) .* rand([-1,1], length(x))

# jittered x
scatter(x_jitter, y)

# jittering lines up with a violin plot
violin!(x,y, alpha=0.1)

```

![Screenshot 2021-08-03 125703](https://global.discourse-cdn.com/julialang/original/3X/9/4/94ee7f31fe3642cb64b1959a87f39a07842b611d.png)

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [August 5, 2021, 9:27am UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/19 "2021-08-05T09:27:55Z")

</div>

Thanks for the example. I agree that this is neat, and a mini-package implementing the calculation would be nice. Preferably in a way that does not depend on plotting libraries, so the result could be used widely.

---

<div class="post-metadata">

**Author:** ![bdeonovic](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdeonovic/32/3928_2.png) [@bdeonovic](https://discourse.julialang.org/u/bdeonovic)\
**Post date:** [August 5, 2021, 2:18pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/20 "2021-08-05T14:18:00Z")

</div>

Why should something like this go in a separate package? This seems like something that should go into StatsPlots maybe?

---

<div class="post-metadata">

**Author:** ![ParadaCarleton](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/paradacarleton/32/20005_2.png) [@ParadaCarleton](https://discourse.julialang.org/u/ParadaCarleton)\
**Post date:** [August 5, 2021, 3:48pm UTC](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457/21 "2021-08-05T15:48:43Z")

</div>

Oh, that’s interesting – when I saw “Quasirandom,” I thought this would be about introducing quasi-random noise, i.e. noise that’s generated using a low-discrepancy sequence such as [this](https://github.com/mschauer/GoldenSequences.jl). (Golden sequences should be optimal in low dimensions.) I actually would like to see that – quasirandom noise should reduce overplotting more than random scatter, which will sometimes overlay points by chance (like in the plots you made).

[Next page](https://discourse.julialang.org/t/jitter-r-function-equivalent-in-julia/43457.md?page=2)
