2016-10-24 1 views
2

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

Я хочу, чтобы коэффициент моего распределения для регрессии моей независимой переменной (пробег) против цены, выполнив мою регрессионного 2000 раз, и путем отбора 300 наблюдений для каждой регрессии.

Ниже модель для моей регрессии:

model <- lm(price ~ mileage, data = dat) 

Я попытался

for (i in 1:2000) model300 <- sample(model[i], size=300) 

Это не сработало. Я получил следующее сообщение об ошибке:

Ошибка в sample.int (длина (х), размер, замена проб): не может взять образец

больше, чем население, когда «заменить = FALSE»

Я попытался обратиться к предыдущему answer на этом форуме, но я не уверен, применим ли он к моему вопросу.

Буду признателен за любые указатели.

ответ

3

Что вы ожидаете получить с помощью выборки из линейного объекта модели?

sample(model[i], size=300) 

Мы хотим отбирать данные и модифицировать модель. I.e., выполнив 2000 раз, мы примеряем данные в 2000 раз и подходим к 2000 регрессионным моделям.


Отбор проб из данных - это ключ. Это было бы многообещающим способом, используя аргумент subset в lm. Для любых задач, требующих многократного повторения процесса, было бы удобно сначала написать функцию, выполняющую такой эксперимент один раз.

f <- function() { 
    fit <- lm(price ~ mileage, data = dat, subset = sample(nrow(dat), 300)) 
    coef(fit) 
    } 

Теперь мы используем replicate повторить это в 2000 раз, чтобы получить матрицу:

z <- t(replicate(2000, f())) 

replicate основан на sapply, который всегда делает cbind() вы получите в конечном итоге с плоской матрицей; для лучшей удобочитаемости я перенес его с помощью t(), чтобы получить длинную матрицу.


В дальнейшем я использую R встроенный в наборе данных cars в качестве примера. Этот набор данных имеет 50 наблюдений, поэтому мы не можем отбирать 300 из них без замены. Я попробую 30 вместо этого.

f <- function() { 
    fit <- lm(dist ~ speed, data = cars, subset = sample(nrow(cars), 30)) 
    coef(fit) 
    } 

Выполнение одного действия дает коэффициент. Часть set.seed предназначена только для воспроизводимости.

set.seed(0); f() 

#(Intercept)  speed 
# -22.69112  4.18617 

Реплицируя это, скажем, в 50 раз, мы получаем матрицу:

set.seed(0); z <- t(replicate(50, f())) 

head(z) ## show first few rows 

#  (Intercept) speed 
#[1,] -22.69112 4.186170 
#[2,] -21.31613 4.317624 
#[3,] -12.98734 3.454305 
#[4,] -22.59920 4.274417 
#[5,] -22.53475 4.584875 
#[6,] -18.88185 4.104758 

Распределение коэффициентов может быть грубо оценена гистограмме:

par(mfrow = c(1,2)) 
hist(z[,1], main = "intercept") 
hist(z[,2], main = "slope") 

enter image description here

Результат выглядит грубым, потому что я не делал много повторений.

+1

Спасибо, это то, чего я пытался достичь. Цель состоит в том, чтобы наблюдать распределение коэффициентов, которые, если реплицироваться достаточно много раз, будут вести себя как нормальное распределение. – Senun

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