2012-02-24 4 views
1

Если у меня есть линия регрессии и квадрат r, есть простая команда numpy (или какая-то другая библиотека python) для случайного рисования, скажем, значений y для x, которые согласуются с регрессией ? Точно так же вы можете просто нарисовать случайное значение из дистрибутива?имитировать данные из строки регрессии в python

Спасибо!

изменить: У меня есть уравнение для моей линии регрессии и значение r^2. Это значение r^2 должно предоставить некоторую информацию о распределении точек данных вокруг моей линии, нет? Если я просто назову это y = random.gauss() * x + b, я не потерял информацию в моем r^2? Или это будет включено в stdv, если да, то как? Извините, я раньше не работал с регрессом.

+0

Для этого нужен генератор случайных чисел. Вы неясны в генераторах генераторов случайных чисел? Или неясно, на y = mx + b применяется наклон регрессии и смещение к случайному значению? Или вы ищете функцию, которая сочетает в себе выражение y = random.gauss() * x + b' в какое-то выражение генератора? Можете ли вы уточнить, что вас сбивает с толку? –

ответ

1

Если я просто назову это y = random.gauss() * x + b, я не потерял информацию в своем r^2?

Очевидно.

Однако.

Чтение документации, мы видим, что random.gauss принимает два аргумента. Среднее и стандартное отклонение.

Среднее значение должно быть равным нулю.

Стандартное отклонение, однако, необходимо отрегулировать в соответствии с вашим r ** 2.

При r ** 2 == 0 стандартное отклонение является высоким. Он должен производить любое значение в исходном диапазоне выборочных данных.

Поскольку r ** 2 приближается к 1, стандартное отклонение уменьшается.

Как вычислить стандартное значение отклонения, которое воспроизводит ваши r ** 2?

Грубая сила.

m, b = regression_model(some_data) 
deviations = list(y - m*x+b for x, y in some_data) 

Этот список отклонений является основным компонентом формулы стандартного отклонения.

sd = math.sqrt(sum(d**2 for d in deviations)/(len(some_data)-1)) 

Теперь вы можете использовать random.gauss(0,sd) воспроизвести отклонения в ваших исходных данных.

См. Ответ @ PaulHiemstra для правильного теоретического подхода.

+1

, если вы используете массив numpy, нет необходимости в понимании списка. Если отклонения представляют собой массив счисления, 'sum (отклонения^2)' должны давать суммы квадратов. –

2

К счастью, нет необходимости в грубой силе :). Для того, чтобы получить зависимость между R^2 и стандартным отклонением остатков, проще всего начать с определением R^2:

R^2 = SSR/SST (1) 

где SSR это суммы квадратов регрессии, т.е. (sum((y'-mean(y))^2) где y' являются значения на линии регрессии, а SST - суммарные суммы квадратов, т. е. sum((y - mean(y))^2), где y являются наблюдениями. Эффективно R^2 - это доля от общей величины дисперсии и величины дисперсии, объясняемой моделью регрессии (или линией).Для нашей цели нам необходимо выразить SSR как SST - SSE, где SSE - суммы квадратов между линией регрессии и наблюдениями. SSE - это дисперсия, которая не объясняется регрессионной моделью. Переписывая (1):

R^2 = (SST - SSE)/SST = 1 - SSE/SST 

выражения для SSE:

SSE = (1 - R^2) SST 

Если мы отмечаем, что идти на суммы квадратов расхождений нам нужно разделить на N-1 этого становится:

VAR_E = (1 - R^2) VAR_T 

для получения стандартного отклонения остатков:

SD_E = sqrt((1 - R^2) VAR_T) 

и принимая УАК из скобок:

SD_E = sqrt(1 - R^2) SD_T 

Так что вам нужен R^2 и общее стандартное отклонение набора данных. Чтобы проверить это, проверьте любую вводную статистическую книгу.

+0

+1 Поскольку полная дисперсия представляет собой сумму (d ** 2 для d в отклонениях) (из моего ответа), кажется, в этом немного грубой силы. Но правильный анализ R ** 2 очень, очень полезен. –

+0

Сумма подразумевается для всех остатков, но в питонании это то, что вы говорите. Я просто привык к векторизации в R, который также должен работать на числовых векторах, я думаю ... –

+0

Отличный ответ, но OP только написал, что у него есть линия регрессии и r квадрат, поэтому я предполагаю, что SD_T неизвестен. –

Смежные вопросы