2017-01-07 4 views
0

Я создаю отчет о статистическом анализе нескольких распределений; более конкретно случайные популяции и то, как их образцы отличаются от них, при этом последние придерживаются свойств нормальных распределений, в то время как их большая популяция в большинстве случаев остается перекошенной.KnitR HTML-вывод, показывающий неправильные/странные результаты. Встроенный код и варианты модификации, не приводящие к правильному выводу

Хотя я более чем доволен остальной частью вывода, я не могу понять, почему определенные числовые значения и их визуализация отличаются от тех, которые выполняются через командную строку. Вот некоторые из воспроизведенной коды несоответствия (первый я генерировать 1000 случайного экспонент):

set.seed(1000) 
pop <- rexp(1000, 0.2) 

В извлекая скажу, среднее pop, я получаю точный правильный результат через консоль, которая 4,76475. Это значение, которое я должен получать через вывод уценки, но вместо этого knitr отображает его как 5.015616.

mean(pop) 
[1] 4.76475 

```{r, echo = T} 
mean(pop) 
``` 
[1] 5.015616 

Его не только среднее значение, но и почти все остальные статистические переменные как для населения, так и для выборки. Кроме того, я также получаю неправильные визуализации в трикотажной продукции:

Original/correct plot

Knitted plot

Участков сами показываются противоречив из-за неправильные результаты. Я думал, что это проблема с настройкой digits, но digits(options) на самом деле ее не решает, и не устанавливается по умолчанию scipen = 0. Я попытался вставить встроенный код, но он все еще показывает мне неправильные значения. Обратитесь к руководству knitR, если отсутствовала настройка куска, но на самом деле не удалось найти там ошибку. Здесь что-то отсутствует или ошибка, связанная с случайными распределениями?

EDIT: Я заметил еще одно своеобразное свойство. Я создал новый файл разметки, чтобы увидеть, изменились ли результаты в соответствии с каждым новым выпуском, который я создал. Назовите это как test.Rmd, но он содержит те же команды, которые я воспроизвел здесь с тем же семенем. И теперь я получаю совершенно другой результат, все еще отличный от исходного значения из командного сеанса.

РЕДАКТИРОВАТЬ: Кажется, что точка Романа работает. Вязаные результаты приближаются к исходным значениям, но все еще не соответствуют друг другу. Семя, установленное на 357, дало мне mean(pop) 4.881604, который находится всего в десятичной точке от исходного значения. Но почему здесь семя является сменой игры? Я думал, что это должно быть 1000.

EDIT: Вот некоторые из кода из .Rmd файла в соответствии с просьбой Фила.

# Load packages 
library(ggplot2) 
library(knitr) 
library(gridExtra) 

# Generate random exponentials 
set.seed(357) 
pop = rexp(1000,0.2) # lambs is 0.2 with n = 1000 
pop.table <- as.data.frame(pop) 

# Take a sample simulating 1000 averages of 40 exponentials 
sample.exp = NULL 
for (i in 1:1000){ 
    sample.exp = c(sample, rexp(40, 0.2)} # n = 40 here 
    sample.df <- as.data.frame(sample.exp) 

# Generate means and compare 
mean(pop) # 4.881604 
mean(sample.exp) # 4.992426 

# Generate variances and compare 
var(pop) # 26.07005 
var(sample.exp) # 0.6562298 

# Some plots 
plot.means.pop <- ggplot(pop.table, aes(pop.table$pop)) + geom_histogram(binwidth = 0.9, fill = 'white', colour = 'black') + geom_vline(aes(xintercept = mean(pop.table$pop), colour = 'red')) + labs(title = 'Population Mean', x = 'Exponential', y = 'Frequency') + theme(legend.position = 'none') +theme(plot.title = element_text(hjust = 0.5)) 

plot.means.sample <- ggplot(sample.df, aes(sample.df$sample.exp)) + geom_histogram(binwidth = 0.2, fill = 'white', colour = 'black') + geom_vline(aes(xintercept = mean(sample.df$sample.exp)), colour = 'red', size = 0.8) + labs(title = 'Sample Mean', x = 'Exponential', y = 'Frequency') + guides(fill = F) + theme(plot.title = element_text(hjust = 0.5)) 

grid.arrange(plot.means.sample, plot.means.pop, ncol = 2, nrow = 1) 

Так вот довольно много основная часть файла, которая дает мне «закрыть» значение, если не ошибки или точные результаты из командной строки. Примечание. Значения, аннотированные, равны новым значениям после установки семени на 357, и я установил то же самое для глобальной среды. Значения, которые я получаю в консоли являются:

  • 4,76475 для населения означают
  • 5,00238 для выборочного среднего
  • 21.80913 для населения дисперсии
  • 0.6492991 для образца дисперсии
+1

Не могли бы вы отправить больше кода, который точно дублирует проблему, с которой вы столкнулись? Прямо сейчас, с кодом, который вы опубликовали, меня немного смущает тот факт, что вы назначаете случайные значения 'pop', но затем вызываете' mean (exp) '. Вы хорошо объяснили эту проблему, но это может помочь увидеть больше того, что вы сделали. – Sam

+0

Насколько важна ваша интерактивная сессия с использованием того же семени, что и ваш сценарий уценки? – Benjamin

+0

Попробуйте установить семя ('set.seed (357)'), прежде чем создавать случайные переменные и посмотреть, совпадают ли они. –

ответ

1

Задавая вопрос на переполнение стека это важно обеспечить minimal reproducible example. В частности, хорошо прочитайте first answer и this advice, и это поможет вам в этом процессе.

Я думаю, что мы все пытались помочь вам (и мы хотим!), Потому что мы не можем воспроизвести вашу проблему. Сравните следующий R и Rmd кода при запуске или трикотажный, соответственно:

# Generate random exponentials 
set.seed(1000) 
pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000 
mean(pop) 
## [1] 5.015616 
var(pop) 
## [1] 26.07005 

и Rmd:

--- 
output: html_document 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(
    echo = TRUE, 
    message = TRUE, 
    warning = TRUE 
) 
``` 

```{r} 
# Generate random exponentials 
set.seed(1000) 
pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000 
mean(pop) 
var(pop) 
``` 

Который производит следующий вывод:

# Generate random exponentials
set.seed(1000)
pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000
mean(pop)
## [1] 5.015616
var(pop)
## [1] 26.07005

Как вы можете видеть, результат идентичны с чистой сессии R и чистой сессии knitr. Это так, как ожидалось, потому что set.seed(), когда он установлен одинаковый, должен давать одинаковые результаты каждый раз (см. Справочную страницу set.seed). При изменении семени до 357, результаты варьируются:

   | mean | var  | 
console (`R`) | 4.88... | 22.88... | 
knitr (`Rmd`) | 4.88... | 22.88... | 

В вашем втором коде блокировать ваш результат knitr кусок является правильным для 1000 семян, но консоль результат 4,76 неверен, предлагая мне свой Консоль производит неправильный вывод. Это может быть по одной из нескольких причин:

  • Вы забыли установить семя в консоли перед запуском функции rexp(). Если вы запустите эту строку без установки семени, результат будет меняться каждый раз. Убедитесь, что вы сначала запустите set.seed(1000) или используйте сценарий R и отправьте его, чтобы убедиться, что шаги выполняются по порядку.
  • В вашей глобальной среде R есть что-то, что влияет на ваши результаты. Это менее вероятно, потому что вы очистили среду R, но это одна из причин, по которой важно время от времени создавать новую сессию, либо закрывая, либо вновь открывая RStudio, либо нажав CTRL + Shift + F10
  • Возможно, быть установленным в RProfile.site или .Rprofile, которые устанавливают параметр при запуске, который влияет на ваши результаты. Посмотрите на Customizing startup, чтобы открыть и проверить параметры запуска, и при необходимости исправить их.

вы видите выход не из-за scipen, потому что нет числа в научных/инженерных нотации, и это не digits потому что различия вы видите больше, чем различия в округлении.

Если эти предложения еще не решают проблему, отправьте минимальный воспроизводимый пример и попробуйте другие компьютеры.

+0

Спасибо за быстрый ответ Phil! Я проверю эти предложения и отчитаюсь. Я сомневаюсь, что это из-за неправильного семени, или есть что-то подозрительное в консоли. И вот где решение лежит точно, если ваши результаты совпадают, мой тоже должен. –

+1

Глупый я; 'set.seed()' был единственным, что здесь отсутствует. Никогда не знал, что каждый новый сеанс должен быть загружен новым семенем каждый раз. Большое спасибо! Может окончательно закончить отчет в мире =) –