Как создать последовательность

11

Я знаю, как создать последовательность со средним значением . Например, в Matlab, если я хочу сгенерировать последовательность длиной , это:0 ± 1 10000±10±110000

2*(rand(1, 10000, 1)<=.5)-1

Тем не менее, как создать последовательность со средним значением , то есть с будучи слегка предпочтительным?0,05 1±10.051

Ка-Ва Ип
источник

Ответы:

18

Ваше желаемое среднее значение определяется уравнением:

NpN(1p)N=.05

из чего следует, что вероятность 1sдолжна быть.525

В Python:

x = np.random.choice([-1,1], size=int(1e6), replace = True, p = [.475, .525])

Доказательство:

x.mean()
0.050742000000000002

1 000 экспериментов с 1 000 000 образцов 1 с и 1 с: введите описание изображения здесь

Ради полноты (отзыв на @Elvis):

import scipy.stats as st
x = 2*st.binom(1, .525).rvs(1000000) - 1
x.mean()
0.053859999999999998

1 000 экспериментов с 1 000 000 образцов 1 с и 1 с:

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

И, наконец, рисование из равномерного распределения, как предлагает @ Łukasz Deryło (также в Python):

u = st.uniform(0,1).rvs(1000000)
x = 2*(u<.525) -1
x.mean()
0.049585999999999998

1 000 экспериментов с 1 000 000 образцов 1 с и 1 с:

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

Все три выглядят практически одинаково!

РЕДАКТИРОВАТЬ

Пара строк по центральной предельной теореме и разброс полученных в результате распределений.

Прежде всего, ничьи средств действительно следуют нормальному распределению.

Во-вторых, @Elvis в своем комментарии к этому ответу сделал несколько хороших расчетов точного разброса средних значений за 1000 экспериментов (около (0,048; 0,052)), 95% доверительный интервал.

И это результаты моделирования, чтобы подтвердить его результаты:

mn = []
for _ in range(1000):
    mn.append((2*st.binom(1, .525).rvs(1000000) - 1).mean())
np.percentile(mn, [2.5,97.5])
array([ 0.0480773,  0.0518703])
Сергей Бушманов
источник
Хорошая работа. Моя цель с Бернулли состояла в том, чтобы свести вопрос к хорошо известному распределению вероятностей; с точки зрения «реализации», ваш ответ и Лукаш были безупречны.
Элвис
Без шуток, ваш самый научный и самый лучший! ;) Я думал о биномиальном распределении в течение полсекунды, но этого было недостаточно, чтобы превратить его в -1 и 1, поэтому я позаимствовал ваше решение "как есть", спасибо!
Сергей Бушманов
1
Итак, с моими обозначениями , а стандартное отклонение равно . Когда вы берете среднее значение для выборок, стандартное отклонение составляет а 95% вычисленного среднего значения должно быть в интервале , то есть . Математика проверить! ;)var(Y)=4var(X)=4p(1p)=0.9975Y0.9991060.999×1030.05±1.96×0.999×103(0.048;0.052)
Элвис
12

Переменная со значениями и имеет вид с a Бернулли с параметром . Его ожидаемое значение , поэтому вы знаете, как получить (здесь ).1 Y = 2 X - 1 X p E ( Y ) = 2 E ( X ) - 1 = 2 p - 1 p p = 0,52511Y=2X1XpE(Y)=2E(X)1=2p1pp=0.525

В R вы можете генерировать переменные Бернулли с rbinom(n, size = 1, prob = p), например,

x <- rbinom(100, 1, 0.525)
y <- 2*x-1
Элвис
источник
5

Равномерно сгенерируйте выборок из , перекодируйте числа ниже 0,525 к 1 и оставьте до -1.[ 0 , 1 ]N[0,1]

Тогда ваше ожидаемое значение

10.525+(1)(10.525)=0.5250.475=0.05

Я не пользователь Matlab, но я думаю, что это должно быть

2*(rand(1, 10000, 1)<=.525)-1
Лукаш Дерило
источник
3
Это правильный способ использования выборки обратного преобразования здесь.
Тим
4

Вам нужно сгенерировать больше 1 с, чем -1 с. Точно, на 5% больше 1, потому что вы хотите, чтобы среднее значение было 0,05. Таким образом, вы увеличиваете вероятность 1 с на 2,5% и уменьшаете -1 с на 2,5%. В вашем коде это эквивалентно изменению 0.5на 0.525, то есть от 50% до 52,5%

Аксакал
источник
2

На всякий случай, если вы хотите, чтобы значение EXACT 0,05 означало, что вы можете сделать эквивалент следующего кода R в MATLAB:

sample(c(rep(-1, 95*50), rep(1, 105*50)))
ddunn801
источник
-1 этот ответ неверный! Единственное, что делает этот код, это то, что он случайным образом переставляет статический вектор значений. Выход не случайный!
Тим
2
@Tim Почему это не работает? Он возвращает список -1 и 1 в случайном порядке со счетчиками, разработанными для обеспечения точного среднего значения 0,05.
ddunn801
1
@ Тим Это решение является случайным. Вы пытались запустить его несколько раз?
whuber
@whuber - это то же самое, что и решение, предложенное Amos Coats, единственная разница - перестановка значений. Статистические свойства такой выборки будут детерминированными и постоянными.
Тим
3
@ Тим, я думаю, вы, возможно, читаете некоторые необоснованные предположения по этому вопросу, которые явно не сделаны. Хотя частоты - и, следовательно, все моменты - самой неупорядоченной выборки будут постоянными, большое разнообразие «статистических свойств» генерируемого ряда будет изменяться случайным образом. Так как пример в вопросе генерирует массив, а массивы не являются множествами - порядок имеет значение в массиве - я думаю, что это толкование справедливо (и оно освещает вопрос). «Решение», опубликованное Coats, с другой стороны, хорошая шутка, но SE не любит шутить.
whuber