2017-01-07 14 views
0

私はいくつかのディストリビューションの統計分析に関するレポートを作成しています。より具体的にはランダムな集団とそれらのサンプルがそれらとどのように異なっているかで、後者は正規分布の特性に従うが、その大集団はほとんどの場合に歪んだままである。KnitR HTML出力が不正確/奇妙な結果を示しています。正しい出力を得られないインラインコードと変更オプション

私は出力の残りの部分に満足していますが、特定の数値とその視覚化がコマンドラインで行われたものと異なる理由を理解できません。ここで不一致の再現コードの一部です(最初の私は1000のランダムな指数を生成する):

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

、たとえばpopの平均値を抽出するには、私は4.76475で、コンソールを通じて、正確な正しい結果を得ることができます。これは私がmarkdownの出力を通るべき値ですが、代わりに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のマニュアルを参照してください。ここに欠けているものや、ランダムな分布に関連するバグはありますか?

編集:私は別の独特の特性に気付きました。新しいマークアップファイルを作成して、作成した新しい出力ごとに結果が異なるかどうかを確認しました。これをtest.Rmdと名をつけましょうが、ここには同じシードで再現したのと同じコマンドが含まれています。そして、私はコマンドセッションからの元の値とはまだ異なる今やまったく異なる結果を得ています。

EDIT:Romanのポイントが動作しているようです。ニットの結果は元の値に近づいていますが、依然として正確に一致していません。 357に設定された種は、元の値から小数点だけ離れたの4.881604を与えました。しかし、なぜシードはゲームチェンジャーですか?私はそれが1000でなければならないと思った。

EDIT:Philが要求した.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) 

エラーがないか、コマンドラインから正確な結果が得られれば、私は 'close'値を与えてくれるファイルのかなりの部分です。注:シードを357に設定した後、注釈された値は新しいの値であり、グローバル環境に対して同じ値を設定しました。私はコンソールで受信していた値は以下のとおりです。人口のための

  • 4.76475はサンプルのため
  • 5.00238は、母集団分散
  • 21.80913を意味するわけ。スタックオーバーフローの質問をしたときは標本分散のための6492991は
+1

実行している問題と正確に重複するコードをさらに投稿できますか?今、あなたが投稿したコードでは、ランダムな値を 'pop'に代入しているのに' mean(exp) 'を呼び出すということでちょっと混乱します。あなたは問題をうまく説明しましたが、あなたがしたことの詳細を見るのに役立ちます。 – Sam

+0

重要ですが、あなたのマークダウンスクリプトと同じシードを使用している対話セッションですか? – Benjamin

+0

ランダム変数を作成して一致するかどうかを確認する前に、シード( 'set.seed(357)')を設定してみてください。 –

答えて

1

それはminimal reproducible exampleを提供するために、不可欠です。特に、first answerthis adviceをよく読んでおいてください。これはプロセスをガイドします。

問題を再現することができないため、私たちはすべてあなたを助けようと奮闘してきました。実行または編まれたときに、それぞれ、以下のRRmdコードの比較:

# 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にシードを変更すると、結果が一緒に変わる:2番目のコードで

   | 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を開いて起動オプションを確認し、必要に応じて修正してください。

あり、科学/工学表記には数字はありません、あなたが見ているの違いは、丸めの違いを超えているので、それはdigitsではありませんので、あなたが見ている出力が原因のscipenではありません。

これらの提案がの場合は、の場合でも問題は解決しない場合は、最小限の再現可能な例を投稿し、他のコンピュータで試してみてください。

+0

迅速な対応Philありがとうございます!私はこれらの提案をチェックし、報告する。私はこれが間違った種のためにあるか疑問に思っている、またはコンソールが鳴っている何かが起こっている。そして、これはソリューションが正確に存在する場所です。結果が一致すれば、私もそうでなければなりません。 –

+1

愚かな私です;ここでは 'set.seed()'だけが欠けていました。毎回、新しいセッションごとに新しいシードをロードする必要があることは決して知りませんでした。どうもありがとう!最終的に平和で報告書を完成させることができます=) –

関連する問題