公卫人

 找回密码
 立即注册

QQ登录

只需一步,快速开始

不劳无获:如何获取钢镚? 因为论坛,所以相逢。 捐赠百科答题至尊

公卫考研:一起风雨兼程 因为梦想,所以努力。 真题答案政治英语

职称考试:诸君逢考必过 因为热爱,所以执着。 模拟考场技能执医中级

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

[讨论] SAS有序样品聚类分析,分享一个单组二元数据的案例

[复制链接]
跳转到指定楼层
1#
cherieling 发表于 2019-8-31 17:25:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

注册后推荐绑定QQ,之后方才可以使用下方的“用QQ帐号登录”。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
注意:在程序运行前,需要先在D盘创建一个名yyj的文件夹
       %let yyj_home=D:\yyj;
        libname yyj "&yyj_home";
        OPTIONS   MSTORED SASMSTORE=yyj;
        data yyj.a1;
            input x @@;
        cards;
        3.19 5.36 4.58 5.39 4.97
        4.93 4.67 2.41 1.64 0.35
        ;
        run;
        proc iml;
            *reset print;
            use yyj.a1;
                  read all into a1;
            close yyj.a1;
            n=nrow(a1);
            call symputx("n",nrow(a1));
            /*产生直径矩阵*/
            * 初始化直径矩阵;
            D=j(n,n,0);
            do i=1 to n;
                do j=1 to n;
                      if j<i then D[j,i]=.;
                      else
                            do;
                                * 计算i~j的平均数;
                                tempSum=0;
                                do m=i to j;
                                    tempSum=tempSum+a1[m];
                                end;
                                tempMean=tempSum/(j-i+1);
                                * 给直径矩阵赋值;
                                do m=i to j;
                                    D[j,i]=D[j,i]+(a1[m]-tempMean)**2;
                                end;
                                D[j,i]=round(D[j,i],0.001);*数据取3位小数,四舍五入;
                        end;
                  end;
            end;
            create yyj.D var("x01":"x&n") ;*此处&n为实际样本数,或者直接写create yyj.D
form D,变量名称自动为col1~coln;
            append from D;
            /*产生直径矩阵结束*/
            /*产生最小损失矩阵*/
            Lb=j(n,n,0);
            lastN=j(n,n,0);
            Lb_lastN=j(n,n,"");
            do j=1 to n;
            do i=1 to n;
                      *排除无意义的点;
                      if i<j|j=1 then
                  do;
                      Lb[i,j]=.;
                      lastN[i,j]=.;
                  end;
                      else
                  do;
                      temp=j(i-j+1,1)-1;
                      do k=j to i;*设最后一段的开始点为k,由于有j段,所以k至少为j;
                            if j=2 then temp[k-j+1]=D[k-1,1]+D[i,k];
                            else temp[k-j+1]=Lb[k-1,j-1]+D[i,k];*当j>2时,即
        分段数大于3时,用递归公式;
                      end;
                      Lb[i,j]=temp[><];
                      lastN[i,j]=temp[>:<]+j-1;*由当前位置m=k-j+1推出最后一段
        的开始点k=m+j-1;
                  end;
                      end;
            end;
            Lb_lastN=char(Lb,15,3)+"("+char(lastN,2,0)+")"; ****将数值矩阵转化为字符矩
        阵,char函数的第3个参数为小数点的位数****;
            create yyj.Lb from Lb;
            append from Lb;
            create yyj.lastN from lastN;
            append from lastN;
            create yyj.Lb_lastN from Lb_lastN;
            append from Lb_lastN;
            /*产生最小损失矩阵结束*/
            /*找出4分段点
            blockNum=j(4,1,0);*初始化一个元素个数为4的向量;
            do j=4 to 1 by -1;
                if j=4 then blockNum[j]=lastN[n,j];*首先得到最后一分段点;
                else if j>1 then blockNum[j]=lastN[blockNum[j+1]-1,j];
                else blockNum[j]=1;
end;
            找出4分段点结束*/
            /*分别找出k分段点*/
            blockNum=j(n,n,.);*初始化一个元素个数为n*n的向量;
            do k=n to 2 by -1;*至少分2段,最多分n段;
                do j=k to 1 by -1;
                  if j=k then blockNum[k,j]=lastN[n,j];*首先得到最后一分段点;
                  else if j>1 then blockNum[k,j]=lastN[blockNum[k,j+1]-1,j];
                  else blockNum[k,j]=1;
                end;
            end;
            /*分别找出k分段点结束*/
            create yyj.blockNum from blockNum;
            append from blockNum;
        quit;
        %put &n;
        ods listing close;
        ods HTMLCSS file="&yyj_home\result.htm" style=printer ;
        title "&n.个有序样品的直径D表";
        proc print data=yyj.D;
        run;
        title " ";
        title "&n.个有序样品的最小损失表";
        proc print data=yyj.Lb_lastN;
        run;
        title " ";
        title "&n.个有序样品的聚类结果";
        proc print data=yyj.blockNum;
        run;
        title " ";
        ods HTMLCSS  close;
        ods listing;

结果:是正确的,我就不上图了。
就是,想问一下:如果是多组数据,该怎么输入呢?如
          7岁  8岁  9  10 11 12 13 14
北京    x1    x2   ..  ..   ..  .    .    .
上海    ..     ..    ..   ..   ..  .    .   .
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

提现|充值|至尊会员||公卫人 ( )

GMT+8, 2019-9-17 03:01 , Processed in 5.099010 second(s), 28 queries , Gzip On.

Powered by X3.4

© 2001-2017

快速回复 返回顶部 返回列表
极速快乐8 北京赛车pk10玩法 南方彩票app 长江彩票计划群 上海11选5走势 秒速快3 百分百彩票计划群 9号棋牌APP 电玩棋牌 北京赛车pk10投注