2016-03-20 5 views
-1

50変数と50個の観測値のセットがあります。n個の観測へのランダムアクセス

100個のランダムな「セル」にアクセスしてその値を変更できますか?

私はこのためにSQLを使用しなければならない場合は素晴らしいでしょう。

+0

1.はい、2.私は質問が何であるか分かりません。あなたがしようとしていることを広げてください。 – Reeza

+0

@Reezaコンセプトが意味をなさないので、私は2番目の質問を削除しました。あなたは前者について詳しく説明できますか? –

+0

あなたはあなたが何をもっと詳細にしたいのか、何を試したのかを説明する必要があります。また、SAS/IMLをお持ちですか? – Reeza

答えて

1

あなたのサンプリングレートは0.04 - レコードの4%が不足に設定されます。私はあなたがすべて同じ型であり、配列にリストすることができる変数を持っていると仮定しています。それでも、その周りには方法があります。もう一つの選択肢は、データを幅広い構造に変換し、Proc SurveySelectを使用して100個のランダムな値を選択し、欠損値に設定することです。 以下のコードは、BASE SASテクニックのみを使用しています。

/*Generate sample data*/ 
data sample; 
array var(50) var1-var50; 
do i=1 to 50; 
    do j=1 to 50; 
     var(j)=rand('normal', 25, 4); 
     end; 
    output; 
end; 

drop i j; 
run; 

*randomly assign to missing; 
data sample_missing; 
    call streaminit(123); *ensure reproducible 100 records; 
    set sample; 
    array var(50) var1-var50; 
    rate=100/(50*50); *based on your question; 

    retain num_miss 0; 
    do i=1 to 50; 

    if rand('bernoulli', rate) = 1 and num_miss < 100 then do; 
     var(i)=.; 
     num_miss+1; 
    end; 

    end; 
run; 

/*Check the values and code*/ 
data check; 
set sample_missing end=eof; 
retain nmiss_cum; 
nmiss_row = nmiss(of var1--var50); 
nmiss_cum+nmiss_row; 

/*if you only want to see the total number missing for checks uncomment the next two lines*/ 
**if eof then output; 

* *keep nmiss_cum; 
run; 
+0

私は正確に100の値を変えることができると思っていましたが(データを1次元に変換することなく)、あなたの答えは最高のものと思われます。ありがとう。 –

+0

私のコードは次元を変換せず、私のサンプルでは正確に100でした.... – Reeza

+0

その種のために、はい。また、正しく理解すれば、 'rate'変数を' rand() 'に渡すことを意味すると思います。 –

1

正確に100個の欠損値が必要な場合は、直接的なブルートフォース方法は、データを2500個のセルと考えることです。 1から2500までの100個の乱数のリストを生成し、それらのセルを欠落に設定します。

data sample; 
    array x(50); 
    do i=1 to 50; 
    do j=1 to 50; 
     x(j)=rand('normal', 25, 4); 
    end; 
    output; 
    end; 

    drop i j; 
run; 

**Generate list of 100 random numbers (there are doubtless better ways :); 
data cellno; 
    do cellno=1 to 2500; 
    ran=ranuni(3); 
    output; 
    end; 
run; 
proc sql outobs=100 noprint; 
    select cellno into :celllist separated by " " 
    from cellno 
    order by ran 
    ; 
run; 

%put &celllist; 

*Use that list to recode 100 cells to null; 
data want; 
    set sample; 
    array x(50); 
    do i=1 to 50; 
    if (_n_-1)*50+i IN (&celllist) then 
     call missing(x{i}); 
    end; 
    drop i; 
run; 
1

おそらくこの問題にK/Nランダムサンプル技術を適用するのが最も簡単です。違う点は、変数アレイの個々の要素を選択して観測するだけではなく、

%let seed=12345; 
%let varlist=X1-X50 ; 
%let samplesize= 100 ; 

data want; 
    set have nobs=nobs ; 
    array x &varlist ; 
    retain _count &samplesize ; 
    retain _left ; 
    if _n_=1 then _left=dim(x)*nobs ; 
    do i=1 to dim(x); 
    if (_count/_left > ranuni(&seed)) then do; 
     x(i) = . ; 
     _count = _count - 1; 
    end; 
    _left = _left - 1; 
    end; 
    drop _left _count i ; 
run; 
関連する問題