-1

私はいくつかの小さな計算を行っていますdata.table.data.framerbind

基本的に私のコードは次のようなものです:

dfdata.frame計算に使用されますが、何が含まれているかが重要です。

l=12000
dti = 1
dt = data.table(ni = 0, nj = 0, regerr = 0)
for (i in seq(1,12000,200)) {
    for (j in seq(1, 12000, 200)) {
        for (ind in 1:nrow(df)) {
            if( i+j >= l/2 ){
                df[ind,]$X =  df[ind,]$pos * 2
            } else {
                df[ind,]$X = df[ind,]$pos/l
            }
        }
        for (i in 1:100) { # 100 sample
            sample(df$X,nrow(df), replace=FALSE) 
            fit=lm(X ~ gx, df)   #linear regression calculation
            regerror=sum(residuals(fit)^2)

            print(paste(i,j,regerror))
            set(dt,dti,1L,as.double(i))             
            set(dt,dti,2L,as.double(j))             
            set(dt,dti,3L,regerror)             
            dti=dti+1

        }
     }
 }

コードは の最初の数ラウンドを出力してから、次のprint(paste(i,j,regerror))エラーで終了します。

 *** caught segfault ***
address 0x3ff00008, cause 'memory not mapped'
Segmentation fault (core dumped)

編集

structure(list(ax = c(-0.0242214, 0.19770304, 0.01587302, -0.0374415, 
0.05079826, 0.12209738), gx = c(-0.3913043, -0.0242214, -0.4259067, 
-0.725, -0.0374415, 0.01587302), pos = c(11222, 13564, 16532, 
12543, 12534, 14354)), .Names = c("ax", "gx", "pos"), row.names = c(NA, 
-6L), class = "data.frame")

どんなアイデアでも大歓迎です。

4

1 に答える 1

4

失礼に聞こえるつもりはありませんが、先に進む前にいくつかのRチュートリアルを読むことでメリットが得られると思います。この質問は、ローカライズされすぎているため、クローズされる可能性が非常に高くなります。また、seg faultsほとんどの場合、どこかにバグがありますが、コードの各部分が何をしているのかを理解することで、この頭痛の種を避けることができます。その金曜日以来、それのいくつかを歩きましょう:

if( i+j >= l/2 ){
   data[ind,]$X =  df[ind,]$pos * 2
}
else{
   data[ind,]$X = df[ind,]$pos/l
}

私はそこから行くdataことを意図していると思います。df私たちはの2つのループの中ijいて、どちらも1から20000になります。合計がそれより少なくなることはない1/2ので、常に最初のステートメントを実行します。また、ケースが発生すると予想した場合は、閉じ中括弧と同じ行に配置FALSEする必要があります。else

if (i + j >= 1/2) {
   df$X <- df$pos * 2
} else {
   df$X <- df$pos
}

Rはベクトル化されているため、上記を実行することは、すべての値をループして2を掛けることと同じです。また、/ 1何も実行しないため、ステートメントを削除しました。このセクション全体をループの外に移動できます。X列の2倍の列を追加するという一定の操作なのでpos

次に、フィットを行うループ:

for (i in 1:100) { # 100 sample
   sample(df$X,nrow(df), replace=FALSE) 
   fit=lm(X ~ gx, df)   #linear regression calculation
   regerror=sum(residuals(fit)^2)

   print(paste(i,j,regerror))
   set(dt,dti,1L,as.double(i))             
   set(dt,dti,2L,as.double(j))             
   set(dt,dti,3L,regerror)             
   dti=dti+1
}

取るとsample(df$X, nrow(df), replace=FALSE)、新しい注文のみが表示されます。実際には割り当てられません。代わりにdf$X <- sample(df$X, nrow(df), replace=FALSE)

さて、あなたはこのフィットエラーの結果とあなたの指標を行に割り当てようとしているように見えますdt(これは変数名によく似た関数でありdf、変数名として避けるべきです) ?dti私の知る限り、iまたはに依存するものはありませんj。代わりに、ランダムに順序付けられたフィット60 * 60 * 100時間を実行します...それがあなたがしたいことであるならば、ぜひそれを行ってください!しかし、代わりに効率的な方法でそれを行ってください:

df$X <- df$pos * 2
fit.fun <- function(n, dat) {
   jumble <- sample(nrow(dat))
   dat$X <- dat$X[jumble]
   sum(residuals(lm(X ~ gx, dat))^2)
}

sapply(1:10, fit.fun, dat=df)
于 2013-02-08T15:45:34.977 に答える