SAS中文论坛

标题: 求助! [打印本页]

作者: liusiyu195    时间: 2015-4-12 11:02
标题: 求助!
下方为一个宏程序,作用是模拟一系列二分变量的LCA数据,那么如何改成模拟多级计分(3,5,7级计分)的程序呢?


%MACRO SimulateLcaDataset(  true_gamma_dataset=,
                                                        true_rho_dataset=,
                                                        output_dataset_name=,
                                                        total_n= ); /*
        PROC IML;  
                * Process input...        ;
                USE &true_gamma_dataset;
                        READ ALL INTO true_gamma;
                CLOSE &true_gamma_dataset;
                USE &true_rho_dataset;
                        READ ALL INTO true_rho_yes;
                CLOSE &true_rho_dataset;
                total_n = &total_n;
            true_nclass = NCOL(true_rho_yes);
                n_items = NROW(true_rho_yes);
                ***************************************************** ;
                items = ('Item' + CHAR((1:n_items),3));
                                                                                * assumes < 1000 items;
                CALL CHANGE(items," ","0",0);
                true_class = J(&total_n,1,0);  
                DO this_person = 1 TO &total_n ;
                        temp = 0;
                        CALL RANDGEN(temp, 'TABLE', true_gamma);
                        true_class[this_person] = temp;
                END;
                responses = J(&total_n, n_items, 0);
                DO this_person = 1 TO &total_n ;
                        DO this_item = 1 TO n_items;
                                temp = 0;
                                this_persons_class = true_class[this_person];
                                CALL RANDGEN(temp, 'BERNOULLI',
                                                true_rho_yes[this_item,this_persons_class]);
                         responses[this_person,this_item] = 2 - temp;         
                        END;
                END;
                ResponsePatterns = J(2**n_items, n_items, 0);
                DO this_item = 1 TO n_items;  
                        temp = REPEAT(1, 2**(n_items-this_item), 1) // REPEAT(2, 2**(n_items-this_item), 1);
                        temp = REPEAT(temp, 2**(this_item-1),1);
                        ResponsePatterns[,this_item] = temp;
                END;
                Count = J((2**n_items),1,0);
                DO pattern_index = 1 TO (2**n_items);
                        Matches = J(&total_n, 1, 1);
                        DO this_item = 1 TO n_items;
                                Matches =         Matches #
                                                        (responses[,this_item]=ResponsePatterns[pattern_index,this_item]);
                                Count[pattern_index] = Matches[+];
                        END;  
                END;  
                 responses_matrix =  ResponsePatterns || Count;
                cols = items || 'Count';
                CREATE &output_dataset_name FROM responses_matrix [ COLNAME = cols ];
                        APPEND  FROM responses_matrix;
                                * The name of the append command can be misleading. ;
                                * It does not append to the data from the previous ;
                                * replication, which is replaced.  It just appends ;
                                * to the new empty dataset, i.e., writes the data. ;
                CLOSE &output_dataset_name;
        QUIT;
        DATA &output_dataset_name;
                SET &output_dataset_name;
                WHERE Count > 0; * omit non-occurring patterns;
        RUN;  
%MEND;





欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2