2

要因(件名)の各レベルに回帰関数を適用しようとしています。アイデアは、Subject ごとに、実際の読書時間 (RT) と対応する印刷された文字列 (WordLen) の長さに基づいて、予測された読書時間を取得できるということです。(Subject) 内の別の関数 (Region) の各レベルに基づいて関数を適用するためのコードを同僚に手伝ってもらいました。ただし、元のコードも、試みた変更 (関数をブレーク全体に単一の係数で適用する) も機能しません。

以下は、いくつかのサンプル データの試みです。

 test0<-structure(list(Subject = c(101L, 101L, 101L, 101L, 101L, 101L, 
101L, 101L, 101L, 101L, 102L, 102L, 102L, 102L, 102L, 102L, 102L, 
102L, 102L, 102L, 103L, 103L, 103L, 103L, 103L, 103L, 103L, 103L, 
103L, 103L), Region = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L), RT = c(294L, 241L, 346L, 339L, 332L, NA, 399L, 
377L, 400L, 439L, 905L, 819L, 600L, 520L, 811L, 1021L, 508L, 
550L, 1048L, 1246L, 470L, NA, 385L, 347L, 592L, 507L, 472L, 396L, 
761L, 430L), WordLen = c(3L, 3L, 3L, 3L, 3L, 3L, 5L, 7L, 3L, 
9L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 7L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 5L, 7L, 3L)), .Names = c("Subject", "Region", "RT", "WordLen"
), class = "data.frame", row.names = c(NA, -30L))

残念なことに、このデータは完全なデータセットでは得られない問題を返しています。

"Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases"

これは、サンプル データが小さすぎるためでしょうか。

とにかく、作業データを提供する能力があるにもかかわらず、誰かがコードの問題に気付くことを望んでいます...

これは元のコードです (動作しません):

for(i in 1:length(levels(test0$Subject)))
  for(j in 1:length(levels(test0$Region)))
    {tmp=predict(lm(RT~WordLen,test0[test0$Subject==levels(test0$Subject)[i] & test0$Region==levels(test0$Region)[j],],na.action="na.exclude"))
    test0[names(tmp),"rt.predicted"]=tmp
    }

そして、これは変更されたコードです (驚くことではありませんが、これも機能しません)。

for(i in 1:length(levels(test0$Subject)))
    {tmp=predict(lm(RT~WordLen,test0[test0$Subject==levels(test0$Subject)[i],],na.action="na.exclude"))
    test0[names(tmp),"rt.predicted"]=tmp
    }

どんな提案でも大歓迎です。

4

4 に答える 4

3

ddply()ライブラリの関数で結果を得ることができますplyr。これにより、 に従ってデータ フレームが分割されSubject、回帰モデルの予測が計算され、新しい列としてデータ フレームに追加されます。

ddply(test0,.(Subject),transform, 
   pred=predict(lm(RT~WordLen,na.action="na.exclude")))

   Subject Region   RT WordLen     pred
1      101      1  294       3 327.9778
......
4      101      1  339       3 327.9778
5      101      1  332       3 327.9778
6      101      2   NA       3       NA
7      101      2  399       5 363.8444
.......
13     102      1  600       3 785.4146

でデータを分割するには、両方の変数を 内に配置する必要がありSubjectます。Region.()

ddply(test0,.(Subject,Region),transform,
    pred=predict(lm(RT~WordLen,na.action="na.exclude")))
于 2013-03-12T12:21:12.423 に答える
2

テストデータの唯一の問題は、SubjectRegionが因子ではないことです。

test0$Subject <- factor(test0$Subject)
test0$Region <- factor(test0$Region)

for(i in 1:length(levels(test0$Subject)))
  for(j in 1:length(levels(test0$Region)))
  {tmp=predict(lm(RT~WordLen,test0[test0$Subject==levels(test0$Subject)[i] & test0$Region==levels(test0$Region)[j],],na.action="na.exclude"))
   test0[names(tmp),"rt.predicted"]=tmp
  }
#   26     27     28     29     30 
# 442.25 442.25 560.50 678.75 442.25 

エラー ( 0 non-NA cases) が発生した理由は、サブセット化を行ったときに、因子ではない変数のレベルでそれを行っていたためです。元のデータセットで、次を試してください。

test0[test0$Subject==levels(test0$Subject)[1],]

あなたは得る:

# [1] Subject Region  RT      WordLen
# <0 rows> (or 0-length row.names)

これは、lm()一緒に仕事をしようとしていたものです

于 2013-03-12T12:21:13.877 に答える
2

あなたの質問は他の人が答えたエラーの説明を求めているようですが(データはまったく要因ではありません)、baseパッケージだけを使用してそれを行う方法は次のとおりです

test0$rt.predicted <- unlist(by(test0[, c("RT", "WordLen")], list(test0$Subject, test0$Region), FUN = function(x) predict(lm(RT ~ 
    WordLen, x, na.action = "na.exclude"))))

test0
##    Subject Region   RT WordLen rt.predicted
## 1      101      1  294       3     310.4000
## 2      101      1  241       3     310.4000
## 3      101      1  346       3     310.4000
## 4      101      1  339       3     310.4000
## 5      101      1  332       3     310.4000
## 6      101      2   NA       3     731.0000
## 7      101      2  399       5     731.0000
## 8      101      2  377       7     731.0000
## 9      101      2  400       3     731.0000
## 10     101      2  439       9     731.0000
## 11     102      1  905       3     448.5000
## 12     102      1  819       3           NA
## 13     102      1  600       3     448.5000
## 14     102      1  520       3     448.5000
## 15     102      1  811       3     448.5000
## 16     102      2 1021       3           NA
## 17     102      2  508       3     399.0000
## 18     102      2  550       5     408.5000
## 19     102      2 1048       7     389.5000
## 20     102      2 1246       3     418.0000
## 21     103      1  470       3     870.4375
## 22     103      1   NA       3     870.4375
## 23     103      1  385       3     877.3750
## 24     103      1  347       3     884.3125
## 25     103      1  592       3     870.4375
## 26     103      2  507       3     442.2500
## 27     103      2  472       3     442.2500
## 28     103      2  396       5     560.5000
## 29     103      2  761       7     678.7500
## 30     103      2  430       3     442.2500
于 2013-03-12T16:40:40.393 に答える
0

これは、2 つのカテゴリ変数の組み合わせに対してデータが存在しないという事実が原因であると予想されます。あなたができることは、最初にサブセットを抽出し、それが と等しくないかどうかを確認しNULL、データがある場合にのみ lm を実行することです。

于 2013-03-12T12:21:22.130 に答える