以前predict()について検証を進めていた際に、不可解なエラーが出てしまい、途中で調査をやめてしまったことがあった。
具体的なエラーは以下である。
> newGalton$child <- predict(lm1, data.frame(newGalton$parent)) 警告メッセージ: 'newdata' は 1000 個の行を持ちますが、見付かった変数は 928 の行数を持ちます:
その後コメントから動くスクリプトを掲示されたので比較してみた。
右側がコメントでいただいたスクリプトである。このコメントについては下記から参照できる。
さてこのスクリプトを比較してみるとdata.frameについてパラメータが異なっている。
自分のスクリプト
data.frame(newGalton$parent)
正しいスクリプト
data.frame(parent=parent.data)
data.frame()の使い方について確認をしたところ、データの指定は”カラム名=データソース”であることがわかった。間違っているほうではデータソースのみを指定しているために何らかの問題が発生していたかと推測される。
ちなみに少ない数でテストをしてみたところ、データソースのみ指定と、カラム名およびデータソース指定で違いは見られなかった。よってこの問題はデータに依存すると考えられる。
> data.frame(c(1,2,3)) c.1..2..3. 1 1 2 2 3 3 > data.frame(id=c(1,2,3)) id 1 1 2 2 3 3

> データソースのみ指定と、カラム名およびデータソース指定で違いは見られなかった。
要素名(列名)が違います。
最初の方は,定義を要素名に使おうとするが,要素名に使えない文字を含むので,そのような文字をドットに置き換えて,結果として c.1..2..3. という要素名が作られた。
二番目の方は,指定した通り id という要素名になっている。
なお,
> id data.frame(id)
のように,変数に割り当てられているベクトルに基づいてデータフレームを作る場合は,要素名が省略されるとベクトルの名前を要素名と解釈してくれます。
> id data.frame(id)
id
1 1
2 2
3 3
また,この場合でも,明示的に指定すれば,別の要素名を使うこともできます。
> data.frame(NAME = id)
NAME
1 1
2 2
3 3
ようするに,要素名で参照する場合は,当然,意図した要素名でないと不都合なのですね。