1

これは、アンケートの重み付けをどのように行うかという問題から始まった物語です。これを正しく行っているように見えたので、少し壁にぶつかりました (インポート プロセスの詳細とstrata変数の由来については、以前の投稿を参照してください)。

> require(foreign)
> ipums <- read.dta('/path/to/data.dta')
> require(survey)
> ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt)
Error in if (nbins > .Machine$integer.max) stop("attempt to make a table with >= 2^31 elements") : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In pd * (as.integer(cat) - 1L) : NAs produced by integer overflow
2: In pd * nl : NAs produced by integer overflow
> traceback()
9: tabulate(bin, pd)
8: as.vector(data)
7: array(tabulate(bin, pd), dims, dimnames = dn)
6: table(ids[, 1], strata[, 1])
5: inherits(x, "data.frame")
4: is.data.frame(x)
3: rowSums(table(ids[, 1], strata[, 1]) > 0)
2: svydesign.default(id = ~serial, weights = ~perwt, strata = ~strata, 
       data = ipums)
1: svydesign(id = ~serial, weights = ~perwt, strata = ~strata, data = ipums)

tabulateこのエラーは関数から発生しているようです。最初に.Machine$integer.max

> .Machine$integer.max <- 2^40

そして、それがうまくいかなかったとき、のソースコード全体tabulate:

> tabulate <- function(bin, nbins = max(1L, bin, na.rm=TRUE))
{
    if(!is.numeric(bin) && !is.factor(bin))
    stop("'bin' must be numeric or a factor")
    #if (nbins > .Machine$integer.max)
    if (nbins > 2^40) #replacement line
        stop("attempt to make a table with >= 2^31 elements")
    .C("R_tabulate",
       as.integer(bin),
       as.integer(length(bin)),
       as.integer(nbins),
       ans = integer(nbins),
       NAOK = TRUE,
       PACKAGE="base")$ans
}

どちらも問題を回避しませんでした。これがパッケージを作成した理由の 1 つffであるようですが、私が心配しているのは、これが .NET で避けられない問題であるということRです。この投稿は、この問題を回避するパッケージを使用したとしても、一度に 2^31 個の要素しかアクセスできないことを示しているようです。私の希望は、メモリの問題を回避するためにsql(sqliteまたは) を使用することでしたが、残念ながら、それを機能させるにはしばらく時間がかかり、同じ基本的な制限に遭遇するだけです。postgresql

に戻そうとしてStataも問題は解決しません。の使用方法については以前の投稿を参照してくださいsvyset。ただし、実行したい計算が原因Stataでハングします。

svy: mean age, over(strata)

より多くのメモリを投入することで問題が解決するかどうかはわかりません。R私は 16 GB のデスクトップで実行しStata、現在メモリ割り当てを 2000MB に設定している Windows サーバーを介して使用していますが、理論的にはそれを増やして実験することができました。

つまり、要約すると:

  1. これはハード制限Rですか?
  2. sql私の問題を解決しますかR
  3. それを多くの個別のファイルに分割すると、それは修正されますか (多くの作業...)?
  4. 多くのメモリを投入するStataことはできますか?
  5. どういうわけか間違ったツリーを真剣に吠えていますか?
4

3 に答える 3

2
  1. はい、R はベクトルに 32 ビット インデックスを使用するため、2^31-1 エントリしか含めることができず、2^40 で何かを作成しようとしています。64 ビット インデックスを導入するという話もありますが、R に登場するまでには少し時間がかかるでしょう。ベクトルにはハード リミットが規定されています。

Qの他の部分についてさらにアドバイスを提供するためにあなたが何をしているのか、私はよく知りません.

完全なデータ セットを使用する理由は何ですか? R が課す制限に収まる小さなサンプルは、同じくらい有用ではないでしょうか? SQL を使用してすべてのデータを格納し、R からクエリを実行して、より適切なサイズのランダムなサブセットを返すことができます。

于 2011-04-02T15:00:03.133 に答える
1

surveyこの質問は少し前に尋ねられたので、ここでの私の回答はパッケージのバージョン 3.3 を使用していることを指摘したいと思います。

のコードを確認するsvydesign,と、すべての問題の原因となっている関数が、nestパラメーターを TRUE に設定する必要があるかどうかを確認するチェック ステップ内にあることがわかります。このステップは、オプションを設定して無効にすることができますcheck.strata=FALSE

もちろん、自分が何をしているのかを理解していない限り、チェック ステップを無効にすべきではありません。nestこの場合、オプションをTRUEまたはに設定する必要があるかどうかを自分で決定できるはずですFALSEnest同じ PSU (クラスター) ID が異なる階層でリサイクルされる場合は、TRUE に設定する必要があります。

具体的には、IPUMS データセットのserial場合、クラスタの識別に変数を使用してserialおり、特定のサンプルの各世帯で一意であるため、 に設定nestすることをお勧めしますFALSE

したがって、アンケートのデザイン ラインは次のようになります。

ipums.design <- svydesign(id=~serial, strata=~strata, data=ipums, weights=perwt, check.strata=FALSE, nest=FALSE)

追加のアドバイス:この問題を回避した後でも、strata を 1 から の範囲に再マップしない限り、コードがかなり遅いことがわかりますlength(unique(ipums$strata))

ipums$strata <- match(ipums$strata,unique(ipums$strata))
于 2016-09-12T09:27:45.917 に答える
0

@Gavinと@Martinの両方がこの答えを称賛するに値するか、少なくとも私を正しい方向に導いてくれます。読みやすくするために、ほとんどの場合個別に回答しています。

私が尋ねた順序で:

  1. はい2^31はの厳しい制限ですがR、それがどのタイプであるかは重要であるように見えます(これは、(私がたくさん持っている)メモリの量ではなく、ベクトルの長さであるため、少し奇妙です)問題を述べました。または変数をに変換しないでください。これにより、長さが修正され、サブセット化の影響が無効になります(これがこの問題を回避する方法です)。strataidfactors

  2. sql私がそれを正しく使う方法を学べば、おそらく助けになるでしょう。私は次のテストを行いました:

    library(multicore) # make svy fast!
    ri.ny <- subset(ipums, statefips_num %in% c(36, 44))
    ri.ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri.ny)
    svyby(~incwage, ~strata, ri.ny.design, svymean, data=ri.ny, na.rm=TRUE, multicore=TRUE)
    
    ri <- subset(ri.ny, statefips_num==44)
    ri.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ri)
    ri.mean <- svymean(~incwage, ri.design, data=ri, na.rm=TRUE)
    
    ny <- subset(ri.ny, statefips_num==36)
    ny.design <- svydesign(id=~serial, weights=~perwt, strata=~strata, data=ny)
    ny.mean <- svymean(~incwage, ny.design, data=ny, na.rm=TRUE, multicore=TRUE)
    

    そして、手段が同じであることがわかりました。これは妥当なテストのようです。

    plyrしたがって、理論的には、またはを使用して計算を分割できる場合sqlでも、結果は良好です。

  3. 2を参照してください。

  4. で大量のメモリをStata投入することは間違いなく役立ちますが、今は厄介なフォーマットの問題に直面しています。必要な計算のほとんどを実行できるようですが(はるかに高速で安定性もあります)、必要な形式にする方法がわかりません。おそらくこれについて別の質問をするでしょう。Stataここでの短いバージョンは、大きな調査データの場合、箱から出してすぐに使用できる方がはるかに優れていると思います。

  5. 多くの点でそうです。これほど大きなデータで分析をしようとすることは、私が軽視すべきことではなく、今でもそれを理解することにはほど遠いです。関数を正しく使用していsvydesignましたが、何が起こっているのかよくわかりませんでした。私は今(ごくわずかに)よく理解しており、問題を解決する方法について私が一般的に正しかったことを知って心強いです。比較するために外部の結果を使用して小さなデータを試すという@Gavinの一般的な提案は非常に貴重であり、私が何年も前に始めるべきだったものです。@Gavinと@Martinの両方に感謝します。

于 2011-04-05T22:29:13.437 に答える