全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SPSS论坛
1949 0
2008-04-29
各位高手、前辈、大侠:
    小弟最近学习写SPSS的程序,已经有了些进步,可以把数据库的一些数据(不超过65000行)保存在Excel文件中,并用 SPLIT FILE LAYERED BY xxx 进行分组计算了,还成功地把分组后的回归结果导出到文件中。
    但现在遇到些问题,看上去只差一点点了,又实在绕不过去,查了挺多的资料,包括 Command Syntax Reference,SPSS Programming and Data Management 4th Edition,都没查到,只好请教各位高手、前辈、大侠了。
    我现在的问题是:下一个回归计算的任务有 2百多万条数据,分为9千多组(数据最多的组约有7千多条数据),我以前尝试过这些办法,都不行:
    1. 用 ODBC 连数据库,用SQL查出所有的数据,也用 SPLIT FILE LAYERED BY xxx 进行分组计算,当数据量只有几千行时,可以完成计算,到了几万行,就死在那里,一个晚上什么输出也没有
    2. 把文件保存在 Excel 或 DBF 中,Excel 有数据行数的限制(不能超过65000多行),即使没有限制,数据量大就会使计算一直死在那里,什么输出也没有
    3. 想写个循环,循环体中,只从数据库中取出一组数据(SQL的where条件中,嵌入循环变量的值),结果是:“在 GET data 之前,不能使用 Loop 语句”。原文如下:
    >Error # 100.  Command name: loop
    >This command is not permitted before the beginning of file definition commands.
    >This command not executed.
    我的代码如下:
    A. 用 ODBC 连数据库,用SQL查出所有的数据,也用 SPLIT FILE LAYERED BY xxx 进行分组计算,当数据量只有几千行时,可以完成计算的:

        GET  data
          /TYPE=ODBC
          /CONNECT=  'DSN=xx_MS_SQL;Description=GJ_3_MS_SQL;UID=xx;PWD=xx;APP=SPSS For Wind' +
              'ows;WSID=xxx;Network=DBMSSOCN'
          /SQL = ' '+
            '     SELECT h.ID, h.LOCATION_ID, h.HOUSE_AREA, h.AVERAGE_PRICE  ' +
            '       FROM house h ' +
            '         WHERE    h.LOCATION_ID <= 5 -- 为了减少数量 ' +
            '         order by  h.LOCATION_ID '
         .
        CACHE.
        DATASET NAME DataSet1 WINDOW=FRONT.
        SPLIT FILE
          SEPARATE BY LOCATION_ID .
        OMS
          /DESTINATION FORMAT = TEXT
            OUTFILE = 'E:\WorkFile\回归\Result_01.txt' viewer = no .
        REGRESSION
          /MISSING LISTWISE
          /STATISTICS COEFF OUTS R
          /CRITERIA=PIN(.05) POUT(.10)
          /NOORIGIN
          /DEPENDENT AVERAGE_PRICE
          /METHOD=ENTER HOUSE_AREA
          /CASEWISE PLOT(ZRESID) ALL .
        OMSEND.
    B. 使用 Excel 中的数据的:
        GET  data
          /Type = XLS
          /CellRange = Full
          /ReadNames = On
          /File = 'E:\WorkFile\待回归_01.xls' .
        PRESERVE.
        SET TVARS NAMES TNUMBERS VALUES.
        SPLIT FILE LAYERED BY LOCATION_ID.
        DATASET DECLARE tempdata.
        OMS …… 后面都同

    C. 尝试写循环,在循环体中,只从数据库中取出一组数据(SQL的where条件中,嵌入循环变量的值)的:

          * loop varLoc = 1 to 2.  写这句就报错 .
          * compute  varLoc = 1.   写这句也报错 . 这两行注解掉,是可以正常执行的
   GET  data
          /TYPE=ODBC
          /CONNECT=  'DSN=xx_MS_SQL;Description=GJ_3_MS_SQL;UID=xx;PWD=xx;APP=SPSS For Wind' +
              'ows;WSID=xxx;Network=DBMSSOCN'
          /SQL = ' '+
            '     SELECT h.ID, h.LOCATION_ID, h.HOUSE_AREA, h.AVERAGE_PRICE  ' +
            '       FROM house h ' +
            '         WHERE    h.LOCATION_ID = 1 -- 1 是一个特定的 LOCATION_ID,希望用循环取每个LOCATION_ID 的数据 ' +
            '         order by  h.LOCATION_ID '
         .

        …… CACHE、OMS 等部分,同前
         * end loop.
    写 compute 会报:
        >Error # 100.  Command name: compute
        >This command is not permitted before the beginning of file definition commands.
        >This command not executed.
    写 loop 会报:
        >Error # 100.  Command name: loop
        >This command is not permitted before the beginning of file definition commands.
        >This command not executed.
     多谢 各位高手、前辈、大侠 的指教啊!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群