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).
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 |