SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1680|回复: 0
打印 上一主题 下一主题

求助!

[复制链接]

1

主题

2

帖子

17

积分

新手上路

Rank: 1

积分
17
跳转到指定楼层
楼主
发表于 2015-4-12 11:02:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下方为一个宏程序,作用是模拟一系列二分变量的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;
分享到:  微信微信
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-12-22 14:01 , Processed in 2.612187 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表