Я хотел бы применить метод выборки Отклонения для имитации случайного вектора Y=(Y_1, Y_2)
равномерного распределения из единицы dis c D = { (X_1 , X_2) \in R^2: \sqrt{x^2_1 + x^2_2} ≤ 1}
, так что X = (X_1 , X_ 2)
является случайным вектором равномерного распределения в квадрате S = [−1, 1]^2
и плотность соединения f(y_1,y_2) = \frac{1}{\pi} 1_{D(y_1,y_2)}.
При отбраковке мы обычно принимаем образец, если f(x) \leq C * g(x)
. Я использую следующий код для:
x=runif(100,-1,1)
y=runif(100,-1,1)
d=data.frame(x=x,y=y)
disc_sample=d[(d$x^2+d$y^2)<1,]
plot(disc_sample)
У меня есть два вопроса:
{Если использовать логически приведенный выше код, размер d
должен быть больше, чем размер disc_sample
но когда я звоню им обоим, я вижу, что в каждом из них есть 100 элементов. Как это могло быть возможно. Почему размеры одинаковы.} ЭТА ЧАСТЬ РЕШЕНА, благодаря комментарию ниже.
Вопрос теперь
Кроме того, как можно Я переформулирую свой код, чтобы дать мне общее количество образцов, необходимое для получения 100 образцов, соответствующих условию. то есть, чтобы дать мне количество отклоненных выборок, пока я не получу 100 необходимых образцов?
Благодаря ответу r2evans , но я хочу написать что-нибудь попроще, пока l oop сохранить все возможные выборки внутри матрицы или фрейма данных вместо списка, а затем вызвать из этого фрейма данных только выборки, соответствующие условию. Я изменил код из ответа без использования списков и без функции sapply, но он не дает нужного результата, он дает только одну строку.
i=0
samps <- data.frame()
goods <- data.frame()
nr <- 0L
sampsize <- 100L
needs <- 100L
while (i < needs) {
samps <- data.frame(x = runif(1, -1, 1), y = runif(1, -1, 1))
goods <- samps[(samps$x^2+samps$y^2)<1, ]
i = i+1
}
, и я также подумал об этом:
i=0
j=0
samps <- matrix()
goods <- matrix()
needs <- 100
while (j < needs) {
samps[i,1] <- runif(1, -1, 1)
samps[i,2] <- runif(1, -1, 1)
if (( (samps[i,1])**2+(samps[i,2])**2)<1){
goods[j,1] <- samps[i,1]
goods[j,2] <- samps[i,2]
}
else{
i = i+1
}
}
но это не работает.
Буду очень признателен за любую помощь в изменении кода.