#r #statistics
#r #Статистика
Вопрос:
Создайте смоделированный набор данных из 100 наблюдений, где x-случайная нормальная переменная со средним значением 0 и стандартным отклонением 1, и y = 0,1 2 * X e, где эпсилон также является случайной нормальной ошибкой со средним значением 0 и sd 1.
set.seed(1) # simulate a data set of 100 observations x lt;- rnorm(100) y.1 lt;- 0.1 2*x rnorm(100)
Теперь извлеките первые 5 наблюдений.
y1.FirstFive lt;- (y.1[1:5]) # extract first 5 observations from y x.FirstFive lt;- (x[1:5]) # extract first 5 observations from x y1.FirstFive # extracted 5 observations from y1 [1] -1.7732743 0.5094025 -2.4821789 3.4485904 0.1044309 x.FirstFive # extracted 5 observations from x [1] -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078
Предполагая, что среднее значение и sd выборки, которые вы рассчитали на основе первых пяти наблюдений, не изменятся, какое минимальное общее количество дополнительных наблюдений вам потребуется, чтобы сделать вывод о том, что истинное среднее значение популяции отличается от 0 при доверительном уровне р = 0,01?
alpha lt;- 0.01 mu lt;- 0 for (i in 5:2000) { # Recalculate the standard error and CI stand_err lt;- Sd_y1 / sqrt(i) ci lt;- sample_mean_y1 c(qt(alpha/2, i-1), qt(1-alpha/2, i-1))*stand_err if (ci[2] lt; mu) break # condition met, exit loop } i [1] 2000
Здесь я написал цикл, который итеративно увеличивает n с начального n=5 до n=2000, использует pt для нахождения значения p (с учетом фиксированного y-бара и sd) и останавливается, когда p Однако я продолжаю получать неверный вывод. Таким образом, выход всегда является номером максимального диапазона, который я даю (здесь это 2000), вместо того, чтобы давать мне конкретную минимальную выборку n, чтобы отклонить значение null, которое mu_y = 0 на уровне p=0,01. Есть какие-либо предложения относительно того, как исправить код?
- дополнительная информация: sd для y1.FirstFive = 2,3 и среднее значение для y1.FirstFive = -0,04
Ответ №1:
Предполагая,:
Sd_y1 = sd(y1.FirstFive) sample_mean_y1 = mean(y1.FirstFive) sample_mean_y1 [1] -0.03860587
Как указывает @jblood94, вам нужно выбрать больший размер выборки.
Для этого вам не нужен цикл for, большинство ваших функций векторизованы, поэтому что-то вроде этого:
n = 5:30000 stand_err = Sd_y1 / sqrt(n) ub = sample_mean_y1 qt(1-alpha/2, n-1)*stand_err n[min(which(ublt;0))] [1] 23889
Комментарии:
1. sd и среднее значение y должны быть получены из извлеченных 5 наблюдений. И это должен быть тест с двумя хвостами.
2. Кроме того, я протестировал свой код с вашим предложением изменить ci[2] lt; mu на ci [1] gt; mu, но результат все равно 2000.
3. Может быть, 2000-это недостаточно высокий показатель.
Ответ №2:
Это потому, что n gt; 2000.
set.seed(1) x lt;- rnorm(100) y.1 lt;- 0.1 2*x rnorm(100) Sd_y1 lt;- sd(y.1[1:5]) sample_mean_y1 lt;- mean(y.1[1:5]) alpha lt;- 0.01 sgn lt;- 2*(sample_mean_y1 gt; 0) - 1 f lt;- function(n) qt(alpha/2, n - 1)*Sd_y1 sgn*sample_mean_y1*sqrt(n) upper lt;- 2 while (f(upper) lt; 0) upper lt;- upper*2 (n lt;- ceiling(uniroot(f, lower = upper/2, upper = upper, tol = 0.5)$root)) #gt; [1] 23889