SPSS – Multikriterální vážení dat

Úloha:

  • V SPSS chceme vážit podle několika nezávislých kritérií.
  • např. podle pohlaví, věku, regionu, velikosti místa bydliště, ekonomické aktivity atd.

Polemika:

  • Přímo v SPSS není žádný jednoduchý nástroj pro takovýto způsob vážení.
  • Nemáte nebo nechcete tvořit vlastní vážicí aplikaci, pro kterou se obvykle musí vytvářet speciální datový soubor s podklady pro vážení, v aplikaci spočítat váhy a vytvořit další datový soubor s váhami, který se posléze importuje zpět do SPSS dat. Uživatelský komfort zde není příliš vysoký.
  • To nás štvalo a proto jsme hledali snadnější řešení.

Řešení s využitím SPSS makra:


DEFINE !mac_weight (w_vars = !ENCLOSE('[',']') / w_var = !ENCLOSE('[',']') / N = !ENCLOSE('[',']')  / w_control = !ENCLOSE('[',']') )

  weight off.
  compute !w_var = 1.
  variable label !w_var 'Weight'.
  aggregate
    /outfile=* mode=addvariables overwritevars=yes
    /@total 'Universum' = sum(!w_var).
  compute @real = 1.
  compute @q_real = 100 * @real / @total.
  execute.

  !IF (!N~=!NULL) !THEN
     compute @total = !N.
  !IFEND

  !LET !w_num_param = !NULL
  !DO !w_pom !IN (!w_vars)
    !LET !w_num_param = !CONCAT(!w_num_param,"1")
  !DOEND

  !LET !hlp_vars = !w_vars
  !DO !w_hlp = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
    !LET !hlp_var    = !HEAD(!hlp_vars)
    !LET !hlp_vars   = !TAIL(!hlp_vars)
    !LET !hlp_code   = !HEAD(!hlp_vars)
    !LET !hlp_vars   = !TAIL(!hlp_vars)
    !LET !hlp_weight = !HEAD(!hlp_vars)
    !LET !hlp_vars   = !TAIL(!hlp_vars)
    recode !hlp_var (!hlp_code = !hlp_weight) into !CONCAT("@w",!hlp_var).
  !DOEND
  execute.

  !LET !hlp_vars = !w_vars
  !LET !w_hlp_crit  = !NULL
  !DO !w_hlp = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
    !LET !hlp_var  = !HEAD(!hlp_vars)
    !LET !hlp_vars = !TAIL(!TAIL(!TAIL(!hlp_vars)))
    !IF (!w_hlp_crit ~= !hlp_var) !THEN
      !LET !w_hlp_crit = !hlp_var
      compute !CONCAT("@ww",!w_hlp_crit) = !CONCAT("@w",!w_hlp_crit).
      compute !CONCAT("@www",!w_hlp_crit) = !CONCAT("@w",!w_hlp_crit).
      sort cases by !w_hlp_crit.
      if (!w_hlp_crit= lag(!w_hlp_crit)) !CONCAT("@ww",!w_hlp_crit) = lag(!CONCAT("@ww",!w_hlp_crit)).
      if (!w_hlp_crit= lag(!w_hlp_crit)) !CONCAT("@www",!w_hlp_crit) = lag(!CONCAT("@www",!w_hlp_crit)).
      if (!w_hlp_crit<>lag(!w_hlp_crit)) !CONCAT("@ww",!w_hlp_crit) = sum(lag(!CONCAT("@ww",!w_hlp_crit)),!CONCAT("@w",!w_hlp_crit)).
      if (!w_hlp_crit<>lag(!w_hlp_crit)) !CONCAT("@www",!w_hlp_crit) = sum(lag(!CONCAT("@www",!w_hlp_crit)),!CONCAT("@w",!w_hlp_crit)).
      aggregate
        /outfile=* mode=addvariables overwritevars=yes
        /!CONCAT("@ww",!w_hlp_crit) = max(!CONCAT("@ww",!w_hlp_crit))
        /!CONCAT("@www",!w_hlp_crit) = max(!CONCAT("@www",!w_hlp_crit)).
      compute !CONCAT("@ww",!w_hlp_crit) = @total * !CONCAT("@w",!w_hlp_crit) / !CONCAT("@ww",!w_hlp_crit).
      compute !CONCAT("@www",!w_hlp_crit) = !CONCAT("@w",!w_hlp_crit) / !CONCAT("@www",!w_hlp_crit).
      aggregate
        /outfile=* mode=addvariables overwritevars=yes
        /break = !w_hlp_crit
        /@number_of_resp = sum(!w_var).
      compute !CONCAT("@q_ww",!w_hlp_crit) = !CONCAT("@ww",!w_hlp_crit) / @number_of_resp.
      compute !CONCAT("@q_www",!w_hlp_crit) = 100 * !CONCAT("@www",!w_hlp_crit) / @number_of_resp.
    !IFEND
  !DOEND
  execute.

  !LET !w_hlp_crit  = !NULL
  !DO !w_hlp1 = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
    !LET !hlp_vars = !w_vars
    !DO !w_hlp2 = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
      !LET !hlp_var  = !HEAD(!hlp_vars)
      !LET !hlp_vars = !TAIL(!TAIL(!TAIL(!hlp_vars)))
      !IF (!w_hlp_crit ~= !hlp_var) !THEN
        !LET !w_hlp_crit = !hlp_var
        aggregate /outfile=* mode=addvariables overwritevars=yes
          /break = !w_hlp_crit
          /@number_of_resp = sum(!w_var).
        compute !w_var = !w_var * (!CONCAT("@ww",!w_hlp_crit) / @number_of_resp).
        execute.
      !IFEND
    !DOEND
  !DOEND

  !IF (!UPCASE(!w_control)="YES") !THEN
    !IF (!N~=!NULL) !THEN
       compute @total = !N.
    !IFEND
    !LET !hlp_vars = !w_vars
    !LET !w_hlp_crit  = !NULL
    !DO !w_hlp = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
      !LET !hlp_var  = !HEAD(!hlp_vars)
      !LET !hlp_vars = !TAIL(!TAIL(!TAIL(!hlp_vars)))
      !IF (!w_hlp_crit ~= !hlp_var) !THEN
        !LET !w_hlp_crit = !hlp_var
        compute !CONCAT("@q_",!w_var) = 100 * !w_var / @total.
        ctables
          /vlabels variables=@q_real !CONCAT("@q_www",!w_hlp_crit) !CONCAT("@q_",!w_var) @real !CONCAT("@q_ww",!w_hlp_crit) !w_var display=none
          /vlabels variables=!w_hlp_crit display=label
          /table 
               @q_real [s][sum '% (Real)' F40.2] +
               !CONCAT("@q_www",!w_hlp_crit) [s][sum '% (Quote)' F40.2] +
               !CONCAT("@q_",!w_var) [s][sum '% (Weighted)' F40.2] +
               @real [s][sum 'Number (Real)' F40.2] +
               !CONCAT("@q_ww",!w_hlp_crit) [s][sum 'Number (Quote)' F40.2] +
               !w_var [s][sum 'Number (Weighted)' F40.2] + 
               !w_var [s][minimum 'Min Weight' F40.2] + 
               !w_var [s][maximum 'Max Weight' F40.2]
               by !w_hlp_crit [c]
          /titles title = !QUOTE(!CONCAT("Checking of Weights - ",!w_hlp_crit))
          /slabels position=row
          /categories variables=!w_hlp_crit order=a key=value empty=include total=yes position=before.
      !IFEND
    !DOEND
  !ELSE
    descriptives weight /statistics = min max.
  !IFEND

  !LET !w_hlp_crit  = !NULL
  !LET !hlp_vars = !w_vars
  !DO !w_hlp = 1 !TO !UNQUOTE(!LENGTH(!w_num_param)) !BY 3
    !LET !hlp_var  = !HEAD(!hlp_vars)
    !LET !hlp_vars = !TAIL(!TAIL(!TAIL(!hlp_vars)))
    !IF (!w_hlp_crit ~= !hlp_var) !THEN
      !LET !w_hlp_crit = !hlp_var
      delete variables !CONCAT("@w",!w_hlp_crit) !CONCAT("@ww",!w_hlp_crit) !CONCAT("@www",!w_hlp_crit) !CONCAT("@q_ww",!w_hlp_crit) !CONCAT("@q_www",!w_hlp_crit).
    !IFEND
  !DOEND
  delete variables @total @real @q_real @number_of_resp !CONCAT("@q_",!w_var).

  weight by !w_var.

!ENDDEFINE.

/* ukázka volání makra.
!mac_weight
 N [1000]
 w_control [yes]
 w_var [weight]
 w_vars [
  q1 1 0.5
  q1 2 0.5
  q2 1 0.25
  q2 2 0.4
  q2 3 0.35
 ]
.

3 komentáře u “SPSS – Multikriterální vážení dat

  1. vyzkousel jsem si to, moc se mi to libi.
    pouzivam vlastni vazeni, ktere jsem si napsal pred mnoha lety v excelu a ktere pracuje na pricipu chi-quatrat test. Pri srovnani jsem zjistil, ze me vazeni nema takovy rozptyl, cili vahy jsou vice soustredene kolem 1.
    na druhe strane ale, Vase vazeni je flexibilnejsi, protoze nevyzaduje Transport dat do excelu a je mozno ho dynamicky pouzit i behem vyhodnocovani bez toho, ze by se musely data transportovat do excelu, tam vazit a znovu v spss nacitat.
    Tato dynamicnost dela Vase reseni velmi zajimave a atraktivni.
    Jeste jednou:
    alle Achtung !.

  2. Note that there is a free extension command, SPSSINC RAKE, available from the SPSS Community website (http://www.ibm.com/developerworks/spssdevcentral) that rakes weights to control totals in up to 10 dimensions and provides a measure of sample efficiency.

    It includes a dialog box interface and standard SPSS syntax. This extension requires the Python plugin and the Advanced Statistics option. As of Statistics version 22, this procedure is installed as part of the Python Essentials.

Napsat komentář