Gestione variabili

Per le espressioni vedi anche Espressioni

rename

Rinomina le variabili.

1
2
3
4
5
 rename old_name_list => new_name_list

 rename :sesso => :sex
 rename [:sesso, :d1, 'd5.1'] => [:sex, :d100, :d5]
 rename s(:d8_,7) => s(:x8_,7)

label

Imposta l’etichetta della variabile. [1]

1
2
3
4
5
 label var => label, varlist => label

 label :sex => "Sesso dell'intervistato"
 label :sex => "SESSO", :area => "MACROAREA"
 label [:mcr1, :mcr2, :mcr3] => "MACROAREA"

levels

Imposta le etichette dei livelli. [1]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 levels var => labels, ...
 levels :sesso => ['M', 'F']

 levels var => {level => label, level => label}, ...
 levels :area => {3 => "CENTRO", 4 => "Sud e Isole"}

 levels :sesso => ['M', 'F'], :area => {3 => "CENTRO", 4 => "Sud e Isole"}

 levels varlist => ...
 levels s(:r100,8) => ["Sì", "No"]

add_levels

Aggiunge nuovi livelli alle variabili in coda a quelli esistenti.

1
2
3
4
5
 add_levels varlist => levels

 add_levels :v1 => ["Non sa", "Non risponde"]
 add_levels [:v10,:v20] => "Non sa"
 add_levels s(:v3_,10) => "Rosso"

copy_label

Etichetta una o più variabili con l’etichetta di un’altra variabile.

1
2
3
4
 copy_label var => varlist

 copy_label :v1 => :r1
 copy_label :v1 => [:r11, :r12, :r13]

copy_levels

Etichetta i livelli di una o più variabili con le etichette dei livelli di un’altra variabile.

1
2
3
4
 copy_levels var => varlist

 copy_levels :v1 => :r1
 copy_levels :v1 => [:r11, :r12, :r13]

lprefix

Aggiunge un prefisso alle etichette dei livelli della variabile.

1
2
3
4
 lprefix varlist => prefix

 lprefix :v123 => "Kg. "
 lprefix [:v123.1,:v123.2] => "Kg. "

lsuffix

Aggiunge un suffisso alle etichette dei livelli della variabile.

1
2
3
4
 lsuffix varlist => suffix

 lsuffix :etaf => " anni"
 lsuffix [:eta1f, :eta2f, :eta3f] => " anni"

level_to_label

Copia l’etichetta di livello come etichetta della variabile.

1
2
3
 level_to_label varlist, level_id

 level_to_label s(d7_,10), 1

label_to_level

Copia l’etichetta della variabile come etichetta di un livello.

1
2
3
 label_to_level varlist, level_id

 label_to_level s(d7_,10), 1

factor

Trasforma una variabile numerica in factor e imposta le etichette. La variabile deve contenere numeri interi.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
factor :etacon, :n7, :d1                            # solo trasformazione in factor

factor :etacon => "Età puntuale",                   # con etichetta variabile
       :sesso => ["SESSO", {1 => "M", 2 => "F"}],   # con etichette variabile e livelli
       :d1 => ["A","B","C","D"]                     # solo etichette livelli

factor :area => ["AREA GEOGRAFICA", ["NO", "NE", "C", "S"]]

factor s(:d7_,10) => ["Sì","No"]                    # più variabili con gli stessi livelli

factor :n1, :n2, :fill => true # controlla i valori esistenti nei dati e genera la sequenza di codici fino al valore più alto

factor :d1 => ["X","Y","Z"]
# equivale a:
factor :d1 => {1=>"X", 2=>"Y", 3=>"Z"}

Avvertimento

E’ necessario porre particolare attenzione ai casi in cui la variabile da trasformare non presenta una sequenza di valori continui che partono da 1.

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Se la variabile v1 contiene i valori: 2, 4 e 5:
   v1
       #     < N.    % >
   2   1       93  43.66
   4   2       50  23.47
   5   3       70  32.86
   N. NA      213 100.00

factor :v1
# produce il warning:
+ trovati 3 livelli per la variabile <v1>: 2, 4, 5 (ATTENZIONE: i codici dei livelli non corrispondono ai valori originari)
# e genera una variabile factor corretta, ma dove la sequenda dei livelli non corrisponde più ai valori:
   v1
       #     < N.    % >
   2   1       93  43.66
   4   2       50  23.47
   5   3       70  32.86
   N. NA      213 100.00

factor :v1 => {4=>"D", 5=>"E"}
# produce l'errore:
- Errore nella sintassi del comando <factor>: [v1] i livelli (4,5) non corrispondono ai valori trovati (2,4,5).

factor :v1 => ["B", "D", "E"]
# produce l'errore:
- Errore nella sintassi del comando <factor>: [v5] i livelli (1,2,3) non corrispondono ai valori trovati (2,4,5).
# equivale infatti a:
factor :v1 => {1=>"B", 2=>"D", 3=>"E"}

factor :v1 => {2=>"B", 4=>"D", 5=>"E"}
# produce il warning:
+ trovati 3 livelli per la variabile <v1>: B, D, E (ATTENZIONE: i codici dei livelli non corrispondono ai valori originari)
# e genera una variabile factor corretta, ma dove la sequenda dei livelli non corrisponde più ai valori:
   v1
       #     < N.    % >
   B   1       93  43.66
   D   2       50  23.47
   E   3       70  32.86
   N. NA      213 100.00

factor :v1 => {1=>"A", 2=>"B", 3=>"C", 4=>"D", 5=>"E"}
# genera una variabile factor completa anche dei livelli mancanti:
   v1
       #     < N.    % >
   A   1        0   0.00
   B   2       93  43.66
   C   3        0   0.00
   D   4       50  23.47
   E   5       70  32.86
   N. NA      213 100.00

factor :v1, :fill => true
# genera una variabile factor completa anche dei livelli mancanti e con le etichette uguali ai valori:
   v1
       #     < N.    % >
   1   1        0   0.00
   2   2       93  43.66
   3   3        0   0.00
   4   4       50  23.47
   5   5       70  32.86
   N. NA      213 100.00

numeric

Trasforma una o più variabili factor in variabili numeriche.

1
2
3
 numeric varlist => new_varlist

 numeric s(:d6_,10) => s(:x6_,10)

string

Trasforma una o più variabili factor in variabili stringa.

1
2
3
 string varlist => new_varlist

 string s(:d6_,10) => s(:txt6_,10)

create

Genera una nuova variabile senza dati. Utilizza la stessa sintassi di factor. Le variabili per cui non si specificano etichette, vengono definite come numeriche.

delete

Cancella le variabili elencate.

keep

Tiene solo le variabili elencate.

copy

Fa una copia di una variabile esistente.

1
2
3
 copy oldvar => newvar
 copy :d1 => :d1bis, :d2 => :d2bis
 copy [:d1, :d2] => [:d1bis, :d2bis]

missing

Ricodifica a blank i codici indicati delle variabili.

1
2
3
4
5
 missing var => value list, :drop => true
 missing :d1 => 9
 missing :d1 => [8, 9], :drop => true
 missing 'd10.1' => [8,9], :d2 => 9
 missing :d1 => "non so"

Se si indica più di un valore, i valori vanno messi tra parentesi quadre (Array). :drop => true elimina i livelli della variabile che hanno frequenza uguale a zero; in caso contrario il livello compare comunque con frequenza 0 nella tabella. Se si utilizza l’etichetta, questa deve essere esattamente uguale, compresi spazi e maiuscolo/minuscolo.

drop_levels

Elimina tutti i livelli della variabile che hanno frequenza uguale a zero.

1
2
3
4
 drop_levels varlist
 drop_levels :d1
 drop_levels [:d1, :d2, :d3]
 drop_levels s(:x10_,8)

na_if

Imposta le variabili a blank se è vera la condizione. Se la condizione non è specificata, l’struzione agisce su tutti i casi.

1
2
3
4
 na_if varlist[, expression]

 na_if :d1, :sesso => 1
 na_if :d2

value

Assegna alle variabili i valori specificati. Accetta un solo valore per tutte le variabili o una lista di valori, uno per ciascuna variabile.

1
2
3
4
5
6
value varlist, valuelist

create :x1
value :x1, 1
value [:v1, :v2, :v3], 99
value [:v11, :v12, :v13], [6,7,8]

value_if

Imposta le variabili uguali al valore se è vera la condizione. Accetta un solo valore per tutte le variabili o una lista di valori, uno per ciascuna variabile. Se la condizione non è specificata, l’struzione agisce su tutti i casi comportandosi come l’istruzione value.

1
2
3
4
5
6
value_if varlist, valuelist[, expression]

value_if :d5, 1, :d5 => :na
value_if s(:d7_10), 1, :d6 => 1
add_levels :d8 => "Non risponde"
value_if [:d8, :x8], [6,99] :d8 => :na

na_to_level

1
na_to_level "NON SO", :d5

recode

Ricodifica una variabile.

 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
28
29
 # con elenco di valori (pesi): ricodifica in una variabile numerica
 recode var => [value list]
 recode :d5 => [0, 10, 25, 50, 100]
 recode :d5 => [NA, 10, 25, 50, 100]

 # con stringa di ricodifica
 recode var => expression, labels => []
 recode :d5 => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"]
 recode :d5 => "NA=6", :labels => get_levels(:d5)+["Non si applica"] # vecchie etichette + nuova etichetta
 recode :d5 => "3=NA", :labels => get_levels(:d5).ids(1,2,4,5)       # elimino livello 3
 recode :country => "c(15,44)=1;c(8,9,18,14,26,29,35)=2;c(24,40,42)=3;c(1,25,37,49)=4;else=NA"
 recode s(:d2_,15) => 'NA=11', :labels => ['1','2','3','4','5','6','7','8','9','10','NON SO']
 recode :x => "lo:1.10=1;1.11:1.20=2;1.21:hi=3", :labels => ["Basso", "Medio", "Alto"], :into => :y

 # con indicazione del numero complessivo di livelli
 recode s(:d2_,15) => 'NA=11', :nlevels => 11

 # ricodifica in una nuova variabile
 recode :d5 => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"], :into => :d5bis
 recode :v100 => "1:3=1;else=0", :into => :v100_1       # else comprende anche le mancate risposte (NA)
 recode :v100 => "1:3=1;NA=NA;else=0", :into => :v100_1 # non ricodifica le mancate risposte

 # più variabili
 recode [:d5, :d6] => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"], :into => [:r5, :r6]

 # con condizione: la variabile ottenuta è numerica
 recode :n100 => "5:hi=5", :if => {:sesso => 1}
 recode :n100 => "5:hi=5", :if => "#sesso == 1"
 recode :n120 => "1=NA", :if => "etanum >= 18"

interaction

Combina i livelli di due o più fattori in un’unica variabile.

1
2
3
4
 interaction newvar => [varlist], :sep => "string", :label => "label"

 interaction :mcrsexeta => [:mcr, :sesso, :eta] # Il separatore di default per le etichette è ": ".
 interaction :sexeta => [:sesso, :eta], :sep => " - ", :label => "CLASSI DI ETA' PER SESSO"

expand

Genera un set di variabili dummy da una variabile factor. Le variabili generate sono di tipo numerico, non factor. Le nuove variabili vengono etichettate con l’etichetta del livello corrispondente.

1
2
3
 expand varname => new_var_root

 expand :eta => :age_  # genera: age_1, age_2, age_3, ecc.

compress

Genera una variabile factor da più variabili. Il caso più comune è la ricostruzione di una variabile singola a partire da variabili dummy che in realtà non sono multiple.

Se non si specifica il parametro :codes, viene utilizzato il codice 1. E’ possibile utilizzare anche un codice diverso per ciascuna variabile.

I valori vengono attribuiti seguendo l’ordine in cui sono state elencate le variabili. In caso di sovrapposizione, i nuovi valori sovrascrivere le precedenti assegnazioni.

Le etichette dei livelli delle nuove variabili, vengono prese dai livelli delle variabili originarie, nel caso di variabili factor, oppure dall’etichetta della variabile, nel caso di variabili numeriche.

1
2
3
4
5
 compress varlist => [newvar, "label"], :codes => value|valuelist

 compress s(:eta_,5) => [:eta, "ETA'"]
 compress s(:eta_,5) => [:eta, "ETA'"], :codes => 1
 compress s(:eta_,5) => [:eta, "ETA'"], :codes => [1,2,3,4,5]

mc_to_md

Trasforma un set di variabili multicategory in un set di variabili multidicotomy. Restituisce l’elenco delle variabili create.

1
2
3
4
 mc_to_md varlist => new_vars_root

 mc_to_md s(:d5_,10) => :x5_
 mc_to_md s(:d5_,10) => 'x5.'

md_to_panel

Trasforma un set di variabili multidicotomy in nuove variabili adatte ad essere utilizzate nel pannello. Le variabili generate sono variabili factor con un unico livello etichettato con l’etichetta della variabile originaria. Se non viene specificato l’elenco delle variabili di destinazione, i nomi delle variabili vengono generate automaticamente. Se non viene specificato il codice delle variabili multidicotomy, viene utilizzato il valore 1. Restituisce l’elenco delle variabili create.

1
2
3
4
5
6
7
8
 md_to_panel varlist, label, new_varlist, code

 md_to_panel s(:v10_,1..3,8,9), "POSSESSO BENI", s(:beni_,5), 1
 # poi, nel pannello
 panels.add :_t, :sesso, s(:beni_,5) :area

 # oppure direttamente nell'istruzione panels.add anche senza specificare i nomi
 panels.add :_t, :sesso, md_to_panel(s(:v10_,1..3,8,9), "POSSESSO BENI"), :area

reorder

Riordina i livelli di una variabile factor riordinando anche le etichette.

  • un vettore con l’elenco dei livelli ordina la variabile in modo arbitrario
  • :rev invertire l’ordine dei livelli
  • :freq ordina in base alle frequenze in senso crescente
  • :dfreq ordinare in base alle frequenze in senso decrescente

Se è attiva una variabile di ponderazione vengono considerate le frequenze pesate.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 # riordina i livelli della variabile v1
 reorder :v1, 3, 2, 5, 4, 1

 # inverte l'ordine dei livelli della variabile v1
 reorder :v1, :rev

 # riordina i livelli in base alle frequenze
 reorder :v1, :freq

 # riordina i livelli in base alle frequenze in senso decrescente
 reorder :v1, :dfreq

switch

Scambia due livelli di una variabile factor scambiando anche le etichette.

1
2
 # inverte il codice 70 della variabile v30 con il 75
 switch :v30, 70, 75

move_before

Sposta dei livelli di una variabile factor prima di un determinato livello. Riordina anche le etichette.

1
2
3
4
5
 # sposta il livello 1 prima del livello 6
 move_before :v100, 1, 6

 # sposta i livelli 4, 6 e 7 prima del livello 1
 move_before :v100, [4,6,7], 1

move_after

Sposta dei livelli di una variabile factor dopo di un determinato livello. Riordina anche le etichette.

1
2
3
4
5
 # sposta il livello 1 dopo il livello 6
 move_after :v100, 1, 6

 # sposta i livelli 5, 6 e 7 dopo il livello 1
 move_after :v100, 5..7, 1

if_any

Crea una nuova variabile che è ugnale a 1 se almeno una delle variabili contiene il valore indicato e 0 in caso contrario.

1
2
 if_any variables_list, code, new_var, label
 if_any [:d7_2, :d7_3], 1, :x7, "EMOZIONI"

if_all

Crea una nuova variabile che è ugnale a 1 se tutte le variabili contengono il valore indicato e 0 in caso contrario.

1
2
 if_all variables_list, code, new_var, label
 if_all s(:d7_,5..8), 1, :x7, "Sia ... sia ..."

if_none

Crea una nuova variabile che è ugnale a 1 se tutte le variabili non contengono il valore indicato e 0 in caso contrario.

1
2
 if_none variables_list, code, new_var, label
 if_none s(:d7_,10), 1, :x7

if_only

Crea una nuova variabile che è ugnale a 1 se almeno una delle variabili del primo set contiene il valore indicato mentre nessuna delle variabili dell’altro set lo contengono. Il secondo set può anche contenere tutto l’insieme delle variabili, pTabs provvederà a sottrarre le variabili del primo set.

1
2
 if_only variables_list_1, code, variables_list_2, new_var, label
 if_only [:d7_3,:d7_5], 1, s(:d7_,1..10), :x7, "Solo 3 o 5"

split_vars

Crea nuove variabili uguali alle variabili di partenza, ma che contengono solo i gruppi di casi definiti da una data variabile. Restituisce un vettore con i nomi delle variabili create.

Con :names è possibile definire un modello per i nomi delle nuove variabili: # è il segnaposto per il livello della variabile che definisce i gruppi, ## è il segnaposto per il nome della variabile di origine. Se :names non viene specificato, i nomi vengono generati automaticamente secondo il modello NomeVariabileGruppi_#_##.

1
2
3
4
5
6
7
 split_vars variable_group => variables_list, :names => template

 # crea delle copie delle variabili per ciascun livello di :sesso
 split_vars :sesso => [:d1,:d2]+s(:d7_,10), :names => "##_sex#"

 # assegna a varlist l'elenco delle variabili create
 varlist = split_vars :sesso => [:d1,:d2]+s(:d7_,10)

derotate

Attenzione

Funzionalità in test. Verificare il risultato.

Scambia le risposte tra diversi set di variabili secondo la rotazione di appartenenza di ciascun caso.

Le rotazioni possono essere definite in due modi:

  • da una variabile numerica o factor che indica l’appartenenza del record a una rotazione (cella). In tal caso è necessario specificare anche il parametro :rot.
  • da una serie di variabili numeriche o factor che indicano le varie permutazioni. Ogni variabile identifica l’oggetto di ciascun set di domande somministrate. Il numero di queste variabili deve essere uguale al numero di set di variabili da derotare. Il parametro :rot non deve essere specificato (il dataset contiene le informazioni necessarie).

:rot specifica lo schema delle rotazioni. E’ un vettore che, per ciascun livello/valore della variabile che identifica la rotazione, contiene la sequenza di rotazione.

Le variabili da derotare sono un vettore di vettori di nomi di variabili: [ [:x1, :y1, :z1], [:x2, :y2, :z2], ... ].

Nell’esempio, le ipotetiche domande a e b vengono ripetute per tre volte per testare tre diversi oggetti. Le domande vengono somministrate ai vari soggetti in quattro diverse sequenze. E’ da notare che il numero di oggetti da testare e il numero di permutazioni non sono necessariamente uguali.

1
 derotate variable_id_rotazione|variables_list_sequenza => variables_list, :rot => schema
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 # l'elenco delle variabili da derotare, memorizzato per comodità nella variabile varlist
 varlist = [ [:a1]+s(:b1_,10),
             [:a2]+s(:b2_,10),
             [:a3]+s(:b3_,10) ]

 # ...oppure, più sinteticamente:
 varlist = 3.rep.map { |i| ["a#{i}"]+s("b#{i}_",10) }

 # ...il vettore multidimensionale risultante:
 [ ["a1", "b1_1", "b1_2", "b1_3", "b1_4", "b1_5", "b1_6", "b1_7", "b1_8", "b1_9", "b1_10"],
   ["a2", "b2_1", "b2_2", "b2_3", "b2_4", "b2_5", "b2_6", "b2_7", "b2_8", "b2_9", "b2_10"],
   ["a3", "b3_1", "b3_2", "b3_3", "b3_4", "b3_5", "b3_6", "b3_7", "b3_8", "b3_9", "b3_10"] ]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 # Metodo 1: con id rotazione

 # :rotazione è la variabile che identifica la rotazione/cella
     rotazione
   1     2
   2     4
   3     3
   4     1
   5     1
   6     2
   ...

 # rot_schema contiene l'elenco delle permutazioni utilizzate
 # (deve corrispondere ai livelli della variabile :rotazione)
 rot_schema = [ [1,2,3],            # per :rotazione = 1
                [2,3,1],            # per :rotazione = 2
                [3,1,2],            # per :rotazione = 3
                [1,3,2] ]           # per :rotazione = 4
 derotate :rotaz => varlist, :rot => rot_schema
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 # Metodo 2: con variabili sequenza

 # le variabili :ro1, :ro2 e :ro3 contengono la sequenza degli elementi (l'ordine dei test)
 # della permutazione utilizzata
     ro1 ro2 ro3
   1   2   3   1
   2   1   3   2
   3   3   1   2
   4   1   2   3
   5   1   2   3
   6   2   3   1
   ...

 derotate s(:ro,3) => varlist

fill

Genera dati casuali. E’ utile per svolgere simulazioni e test di tavole. Per le variabili factor vengono generati i valori corrispondenti ai livelli della variabile. Per le variabili numeriche è necessario specificare il range di valori. Vengono generati solo valori interi.

Nel caso sia impostato filter, fill genera valori per i soli casi non filtrati.

Opzioni:

  • :range: vettore con il valore minimo e il valore massimo. Solo per numeriche.
  • :cases: :na (default) genera valori solo per i casi in cui la variabile è missing, :valid genera valori solo per i casi in cui la variabile ha un valore, :all genera valori per tutti i casi
  • :probs: vettore con le probabilità di estrazione per ciascun valore da estrarre. Devono essere in numero uguale ai diversi valori da generare. Il parametro :auto calcola automaticamente le probabilità in base alla distribuzione dei casi validi della variabile (casi filtrati se è attivo un filtro).
  • :seed: un numero intero che viene usato come seed per la generazione dei valori casuali

Quando viene fornito il parametro :probs e non il parametro :seed, viene calcolata iterativamente la soluzione migliore.

1
2
3
4
5
6
7
8
 fill :d1
 fill :sesso, :probs => [45, 55]
 fill :area, :probs => [0.2, 0.2, 0.5, 0.1]
 fill :v100, :range => [1,10], :cases => :all
 fill :v4500, :cases => :na, :probs => :auto

 filter :sesso => 1, :label => "Maschi"
 fill :v221, :seed => 3

Produce nell’output una tabella con le distribuzioni di frequenze dei valori iniziali della variabile, dei valori generati e dei valori finali:

> fill :x1, :range => [1,2], :cases => :na

Fill x1
  Value     Pre  ->  Gen  ->  Post
1     1      NA       66        66
2     2      NA       80        80
3     9     154       NA       154
4  <NA>     146        0         0

seed

Imposta il seed per la generazione delle sequenze di numeri casuali. Permette la riproducibilità delle sequenze di numeri casuali.

1
 seed 2

Note

[1](1, 2) Nelle etichette delle variabili di pannello è possibile utilizzare il carattere _ (parametro :hyphen_char) e | (parametro :break_char). Sono utili nei pannelli dell’output di testo: il primo inserisce il trattino e manda a capo l’etichetta, il secondo va a capo senza inserire il trattino. Negli altri formati vengono ignorati ed eliminati.