Поддельная статистика


27

Если вы собираетесь придумывать какие-то фальшивые новости, вам нужно будет сфабриковать некоторые данные для их резервного копирования. У вас уже должны быть некоторые предвзятые выводы, и вы хотите, чтобы некоторые статистические данные укрепили аргумент вашей ошибочной логики. Этот вызов должен помочь вам!

Даны три входных номера:

  • N - количество точек данных
  • μ - среднее значение точек данных
  • σ - стандартное отклонение точек данных, где μ и σ определяются как:

    введите описание изображения здесь

Выведите неупорядоченный список чисел 𝑥 i , который будет генерировать данные N , μ и σ .

Я не буду слишком требователен к форматам ввода / вывода, но я ожидаю, что какой-то десятичный знак для μ , σ и выходных точек данных. Как минимум, должны быть поддержаны как минимум 3 значащие цифры и величина как минимум 1 000 000. IEEE плавает просто отлично.

  • N всегда будет целым числом, где 1 ≤ N ≤ 1000
  • μ может быть любым действительным числом
  • σ всегда будет ≥ 0
  • Точки данных могут быть любым действительным числом
  • если N равно 1, то σ всегда будет 0.

Обратите внимание, что большинство входов будет иметь много возможных выходов. Вам нужно только дать один действительный вывод. Вывод может быть детерминированным или недетерминированным.

Примеры

Input (N, μ, σ) -> Possible Output [list]

2, 0.5, 1.5 -> [1, 2]
5, 3, 1.414 -> [1, 2, 3, 4, 5]
3, 5, 2.160 -> [2, 6, 7]
3, 5, 2.160 -> [8, 4, 3]
1, 0, 0 -> [0]

6
Если бы мы добавили ввод правдивости / ложности для p-значения, чтобы нам приходилось делать либо коррелированные, либо некоррелированные данные либо для fake-backup, либо для fake-disprove ahaha.
Волшебная урна осьминога

1
Что +veи -veозначает?
CG.

@ChelseaG. Сокращения для положительного и отрицательного . Я редактировал, чтобы уточнить.
Цифровая травма

Когда N = 1, σ всегда будет 0, чтобы сделать это возможным?
xnor

1
На самом деле мы, педанты, должны использовать исправленное стандартное отклонение выборки и не применять его для входов с N = 1.
Джонатан Аллан

Ответы:


8

Pyth , 44 35 34 байта

? eA.DhQ2 + eQ * G, -eQJ * E @ hc1thQ2 + eQJ * G, -eQKE + eQK .N 
? eA.DN2+T*G+LT_B*Y@hc1tN2*G+LT_BY
.N? EA.DN2+T*G+LT_B*Y@cNtN2*G+LT_BY

Попробуйте онлайн! (Приведенный выше код определяет функцию. :.*Добавляется к ссылке для вызова функции.)

Математика

Это создает данные симметрично. Если Nчёт, то данные - это просто среднее плюс или минус стандартное отклонение. Однако, если Nнечетно, то мы просто открыли банку с червями, так как среднее значение должно присутствовать, чтобы данные были симметричными, и поэтому флуктуации должны быть умножены на определенный коэффициент.

Если nдаже

  • Половина данных есть μ+σ.
  • Половина данных есть μ-σ.

Если nстранно

  • Одна точка привязки находится μ.
  • Менее половины данных μ+σ*sqrt(n/(n-1)).
  • Менее половины данных μ-σ*sqrt(n/(n-1)).

6

MATL , 22 байта

Спасибо @DigitalTrauma за исправление.

:t&1Zs/tYm-*+tZN?3G9L(

Входной заказ: N, σ, μ.

Попробуйте онлайн!

Или посмотрите измененную версию, которая также вычисляет среднее значение и стандартное отклонение произведенных данных, в качестве проверки.

объяснение

Код делится на четыре части:

  1. :генерирует массив, [1 2 ... N]где Nберется в качестве неявного ввода.

  2. t&1Zs/делит эти числа на их эмпирическое стандартное отклонение (вычисленное с помощью нормализации N) и tYm-вычитает эмпирическое среднее из полученных значений. Это гарантирует, что результаты имеют эмпирическое среднее значение 0и эмпирическое стандартное отклонение 1.

  3. *умножает на σи +добавляет μ, оба принимаются как неявные входные данные.

  4. tZN?x3Gобрабатывает особый случай , который N = 1, σ = 0для которого выход должен быть μ. Если это действительно так, то эмпирическое стандартное отклонение, вычисленное на втором шаге, было следующим 0: деление infи умножение σна третий шаг NaN. Итак, что делает код: если полученный массив состоит из всех NaNзначений (кода tZN?), удалите его ( x) и нажмите третий вход ( 3G), который есть μ.


4

Python , 50 байт

lambda n,m,s:[m+s*(n-1)**.5]+[m-s/(n-1%n)**.5]*~-n

Попробуйте онлайн!

Использует следующее nраспределение -элементов со средним значением 0и sdev 1:

  • С вероятностью 1/n(то есть 1элемент), выход(n-1)**0.5
  • С вероятностью 1-1/n(то есть n-1элементами), вывод-(n-1)**(-0.5)

Это изменено, чтобы означать mи sdev s, преобразовывая x->m+s*x. Досадно, n=1дает деление на ноль для бесполезного значения, поэтому мы взламывать его прочь, делая /(n-1%n)**.5, с 1%nдавая 0для n==1и в 1противном случае.

Вы можете подумать, что (n-1)**.5можно сократить до ~-n**.5, но возведение в степень происходит первым.

А defна один байт длиннее.

def f(n,m,s):a=(n-1%n)**.5;print[m+s*a]+[m-s/a]*~-n

3

R 83 62 53 байта

function(n,m,s)`if`(n>1,scale(1:n)*s*sqrt(1-1/n)+m,m)

Если n=1, тогда он возвращает m(поскольку scaleвернется NA), в противном случае он масштабирует данные, [1,...,n]чтобы иметь среднее значение 0 и (выборочное) стандартное отклонение 1, поэтому он умножается на, s*sqrt(1-1/n)чтобы получить правильное стандартное отклонение популяции, и добавляет mсдвиг к соответствующему среднему значению. Спасибо Дейсону за то, что он познакомил меня с функцией масштабирования и сбросил эти байты!

Попробуйте онлайн!


Можете ли вы добавить несколько тестов в Try It Online, чтобы ваш ответ мог быть легко проверен?
Цифровая травма

Ага! дай мне две минуты
Джузеппе

Возможно, просто использовать 1:nвместо того, rt(n,n)чтобы сохранить 4 байта. И scaleфункция, вероятно, может быть полезной.
Дейсон

@Dason - спасибо! Я узнал о том, scaleчто это здорово.
Джузеппе

1

Желе , 20 байт

÷_Ḃ$©$*.;N$ṁ®;0ṁ⁸×⁵+

Попробуйте онлайн!

Полная программа, принимающая три аргумента командной строки: n , μ , σ .

Как?

Создает минимальные (n / 2) значения, равноудаленные от среднего и значения среднего, если n нечетно, так что стандартное отклонение является правильным ...

÷_Ḃ$©$*.;N$ṁ®;0ṁ⁸×⁵+ - Main link: n, μ (σ expected as third input, the 5th command argument)
   $                 - last two links as a monad:
 _                   -   n minus:
  Ḃ                  -     n mod 2            i.e. n-1 if n is odd, n if n is even
    ©                - copy value to register
÷                    - n divided by that
       .             - literal 0.5
      *              - exponentiate = (n / (n - (n mod 2))) ^ 0.5
                     -        i.e. 1 if n is even; or (n/(n-1))^0.5 if n is odd
         $           - last two links as a monad:
        N            -   negate
       ;             -   concatenate   i.e. [1,-1] or [(n/(n-1))^0.5,-(n/(n-1))^0.5]
            ®        - recall value from register
           ṁ         - mould the list like something of that length
             ;0      - concatenate a zero
                ⁸    - link's left argument, n
               ṁ     - mould the list like something of length n (removes the zero for even n)
                  ⁵  - fifth command argument, third program argument (σ)
                 ×   - multiply (vectorises)
                   + - add μ (vectorises)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.