Raking

rake

L’istruzione rake genera delle variabili di ponderazione dei dati in base alle distribuzioni marginali.

Argomenti:

  • title: il titolo della ponderazione (opzionale)
  • :names => varnames: la lista dei nomi delle variabili di ponderazione che devono essere create: la variabile di ponderazione con media 1, più eventuali altre variabili di espansione (default: ipf).
  • :counts: la lista delle numerosità totali dei casi delle variabili di espansione.
  • :population: un hash con i marginali delle variabili di ponderazione, nel formato: nome_var => [marginali]. I valori vengono interpretati come proporzioni. Le variabili non devono avere casi mancanti. Il numero di marginali di ciascuna variabile deve corrispondere al numero di livelli della variabile.
  • :pw => varname: il nome della variabile peso di partenza.
  • :if_na: comportamento in caso di valori mancanti nelle variabili di ponderazione:
    • :error: (il default) interrompe l’esecuzione
    • :na: assegna peso uguale a NA (valore mancante)
    • valore: assegna peso uguale a valore
  • :if_zero: comportamento in caso di un codice presente in population, ma senza nessun caso nel sample:
    • :error: (il default) genera un errore
    • :skip: continua l’esecuzione ignorando il codice
  • :if => expression: filtro per selezionare un sottoinsieme di casi da ponderare [1]. Ha il sopravvento rispetto a un eventuale filtro impostato con l’istruzione filter. (altrimenti viene lasciato il valore preesistente o NA se la variabile di ponderazione non esiste già)
  • :xlsx => filename: esporta le variabili di ponderazione create in un file Excel 2007
  • :sav => filename: esporta le variabili di ponderazione create in un file SPSS
  • :id => varname: specifica l’identificativo dei record da utilizzare nel file di esportazione. I dati saranno ordinati sull’id.
  • :maxit => number: controlla il numero di iterazioni (default: 100).
  • :delta => number: il modello converge quando la differenza massima tra le percentuali dei marginali ottenuti e di quelli desiderati è inferiore o uguale a delta (default: 0.01).
  • :epsilon => number: il modello converge quando la differenza dei pesi tra le ultime due iterazioni è inferiore o uguale a epsilon.
  • :print => :iter: stampa un riepilogo delle iterazioni.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 # genera solo il peso per la ponderazione
 rake :names => :peso,
      :population => { :sesso => [150, 150], :eta => [25, 75, 150, 50] },
      :xls => "ipf", :id => :ser_no

 # genera 3 variabili di ponderazione
 rake "Ponderazione con socio-demo",
      :names => [:ipf, :espcam, :espuni],
      :counts => [350, 4500],
      :population => { :sesso => [150, 150],
                       :eta => {1=>25, 2=>75, 3=>150, 4=>0},
                       :area => {1=>75, 2=>75, 3=>75, 4=>75} },
      :sav => "ipf", :id => :ser_no

 # pondera in due step i dati
 rake :names => :ipf, ... :if => {:campio => 1}
 rake :names => :ipf, ... :if => {:campio => 2}

Casi particolari:

  • Se sono presenti codici in più nella variabile rispetto a population, viene generato un errore
  • Se sono presenti codici in più in population rispetto alla variabile, vedere il parametro if_zero
  • Se una variabile presenta valori mancanti, vedere il parametro if_na
  • Se presenti codici senza etichetta, viene generato un warning (!)
  • Se sono presenti codici in population con valore zero, ma con osservazioni diverse da zero, viene generato un warning (!)
  • Se sono presenti codici in population con valore zero e senza osservazioni, viene generato un warning (!)
  • Se nella variabile sono presenti livelli senza osservazioni che non sono presenti in population, viene generato un warning (!)

Output

rake genera alcune tabelle di diagnostica nella finestra di log e in un file in formato xlsx (rake-title.xlsx).

_images/rake1.png

population

  • i valori marginali possono essere inseriti come hash, indicando il codice e il rispettivo valore
  • i valori marginali possono essere inseriti come vettore e in tal caso i valori verranno attribuiti a una sequenza di codici a partire da 1
  • oltre a un codice è possibile specificare anche un vettore di codici oppure un range di valori
  • :sample al posto del valore indica che deve essere mantenuta la percentuale effettivamente riscontratta nel sample di dati
  • :else al posto del codice indica che il valore deve essere attribuito a tutti i codici non specificati
1
2
3
4
5
6
7
8
:v1 => [50, 25, 25, 20]                       # un vettore di valori
:v1 => {1=>50, 2=>25, 3=>25, 4=>20}           # un hash con le coppie codice / valore
:v1 => {1=>50, 2=>25, 3=>25, 4=>:sample}      # il codice 4 utilizza la percentuale esistente nel sample
:v1 => {1=>50, 2=>:sample, 3=>25, 4=>:sample} # :sample per i valori 2 e 4
:v1 => {1=>50, 3=>25, [2,4]=>:sample}         # :sample per i valori 2 e 4
:v1 => {1=>50, 2=>50, 3..4=>:sample}          # :sample per i valori 3 e 4
:v1 => {1=>50, 2=>50, :else=>:sample}         # :sample per i valori non ancora specificati (3 e 4)
:v1 => :sample                                # :sample per tutti i valori della variabile

rake_stop_on_failure

Il parametro di configurazione rake_stop_on_failure determina il comportamento in caso di non convergenza:

  • true: errore (default)
  • false: continua con un warning ma genera comunque le variabili di ponderazione

Valori di ritorno

rake restituisce un oggetto contenente le statistiche della ponderazione, che, se assegnato a una variabile, può essere utilizzato nello script per condizionarne l’esecuzione. L’oggetto disponde dei metodi :efficiency, :niter, :n, :sum, :min, :max, :range , :median, :mean, :stdev, :serr, :esp che restituiscono le statistiche relative alla prima variabile di ponderazione. E’ inoltre possibile accedere alle statistiche delle altre variabili di ponderazione con la sintassi variabile["nome_peso"]: per es. result["ipf2"].esp

Se non si assegna esplicitamente rake a una variabile, è possibile usare la variabile $rk che contiene un riferimento all’ultima istruzione rake eseguita.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 ### rilanciare una nuova ponderazione
 # prima ponderazione
 result = rake :names ...
 if result.min < 0.3 || result.max > 3
   # nuova ponderazione, con meno variabili marginali o con classi più aggregate
   result = rake :names ...
 end
 # se i valori non sono ancora soddisfacenti
 err "i valori dei pesi sono troppo alti: #{result.min} <> #{result.max}" if result.min < 0.3 || result.max > 3

 ### una scelta tra due ponderazioni in base all'efficienza
 if res1.efficiency > res2.efficiency
   weight! :peso1 => :peso
 else
   copy :peso2 => :peso
 end
 # oppure
 if res1.efficiency > res2.efficiency
   copy :peso1 => :peso
 else
   copy :peso2 => :peso
 end
 weight! :peso

 ### mostra una finestra di dialogo se l'efficienza è minore di 70
 # utilizzando la variabile $rk
 stop unless ask("L'efficienza è #{$rk.efficiency.round(2)}. Continuo comunque?") if $rk.efficiency < 70

Consiglio

Per l’utilizzo delle variabili di ponderazione si veda Ponderazione.

Note

[1]Per le espressioni vedi anche Espressioni