请选择 进入手机版 | 继续访问电脑版
楼主: dxystata
4604 11

SAS中如何进行有序聚类 [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182007 个
通用积分
15204.8228
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
290590 点
帖子
5365
精华
1
在线时间
13470 小时
注册时间
2006-6-21
最后登录
2024-4-19

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

dxystata 发表于 2014-1-2 14:36:39 |显示全部楼层 |坛友微信交流群
50论坛币
RT,谢谢!

最佳答案

wsyxh 查看完整内容

现在把胡良平教授的教材《面向问题的统计学3》中的范例奉上,仅供参考。 本例一个分类指标,多个分类指标也是可以的。 Data mxwttjxt10_1; input x@@; cards; 9.3 1.8 1.9 1.7 1.5 1.3 1.4 2.0 1.9 2.3 2.1 ; run; proc iml; use mxwttjxt10_1; read all into matrix_a; close mxwttjxt10_1; n=nrow(matrix_a); call symputx("n",nrow(matrix_a)); call symputx("m",ncol(matrix_a)); /*一 ...
关键词:如何

本帖被以下文库推荐

wsyxh 发表于 2014-1-2 14:36:40 |显示全部楼层 |坛友微信交流群
现在把胡良平教授的教材《面向问题的统计学3》中的范例奉上,仅供参考。
本例一个分类指标,多个分类指标也是可以的。

Data mxwttjxt10_1;
  input x@@;
  cards;
  9.3 1.8 1.9 1.7 1.5 1.3 1.4 2.0 1.9 2.3 2.1
  ;
run;
proc iml;
  use mxwttjxt10_1;
  read all into matrix_a;
  close mxwttjxt10_1;
  n=nrow(matrix_a);
  call symputx("n",nrow(matrix_a));
  call  symputx("m",ncol(matrix_a));

/*一、产生直径矩阵*/
  D=j(n,n,0);            /*建立n行n列的矩阵,元素初值均为0,以用来存储类的直径*/
  do i=1 to n;
   do j=1 to n;
    if i<j then D[i,j]=.;   /*用以得到下三角矩阵形式的直径矩阵*/
    else do;        
     temsum=matrix_a[i:j,];             /*选取第i行到第j行作为子矩阵*/
         temsum2=temsum-shape(temsum[:,],i-j+1,&m);          /*用子矩阵中各元素减去本列元素的均值,得到离均差*/
     D[i,j]=round(ssq(temsum2),0.001);          /*计算矩阵中所有元素的平方和,并保留3位小数*/
    end;
   end;
  end;
  create D var("obs1":"obs&n");     *此处&n为实际样本数;
  append from D;
/*产生直径矩阵结束*/

/*二、产生最小损失矩阵*/
  Lb=j(n,n,0);         /*建立n行n列的矩阵,元素均为0,以用来存储最小损失函数值*/
  lastN=j(n,n,0);     /*建立n行n列的矩阵,元素均为0,以用来存储最后一个分类的样品起始号*/
  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函数的第三个参数为小数点的位数*;
  create Lb from Lb;
  append from Lb;
  create Lb_lastN from Lb_lastN;
  append from Lb_lastN;
/*产生最小损失矩阵结束*/

/*三、分别找出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];    *首先得到最后一分段点,由矩阵lastN中获得,lastN[n,j]即表示n个样品分为j类时最后一类的起始点;
         else if j>1 then blockNum[k,j]=lastN[blockNum[k,j+1]-1,j];   /*欲求中间某段的起始点,也可由lastN中获得,相当于剩余的样品(其个数可用后一类起始点-1计算得到)分为j类时最后一类的起始点*/
         else blockNum[k,j]=1;                        
    end;
  end;
/*分别找出k分段点结束*/
  create blockNum from blockNum;
  append from blockNum;
quit;
ods html;
proc print data=D;             /*输出直径表*/
  title "&n.个有序样品的直径D表";
run;
proc print data=Lb_lastN;     /*输出最小损失表*/
  title "&n.个有序样品的最小损失表";
run;
proc print data=blockNum;    /*输出分类结果*/
  title "&n.个有序样品的聚类结果";
run;
title " ";
ods html close;
data a;                     
  set Lb;
  where col&n^=.;
  drop col1;
run;
proc transpose data=a out=b;
run;
data c;
  set b;
  cluster=_n_+1;
  drop _NAME_;
  rename col1=Lp;
run;
proc gplot data=c;     /*绘制最小损失函数值随分类数变化的趋势图*/
  plot Lp*cluster;
  symbol interpol=join;
run;

使用道具

zzs92121 发表于 2014-1-2 15:41:31 |显示全部楼层 |坛友微信交流群
不明白什么是有序聚类。。。sas 里聚类分析相关的内容在proc cluster

使用道具

402play 发表于 2014-1-3 10:33:00 |显示全部楼层 |坛友微信交流群
sas 里聚类分析相关的内容在proc cluster

使用道具

wsyxh 发表于 2014-1-6 12:19:18 |显示全部楼层 |坛友微信交流群
其它软件可以做有序聚类,但是我也不知SAS如何做有序聚类。

使用道具

wsyxh 发表于 2014-1-6 12:20:41 |显示全部楼层 |坛友微信交流群
zzs92121 发表于 2014-1-2 15:41
不明白什么是有序聚类。。。sas 里聚类分析相关的内容在proc cluster
有序数据的聚类,就是数据的前后顺序不能破坏,还要进行聚类分析。如:按照人一生各项的不同生理指标,把人的一生分成几段,就是一个聚类分析。比如:即使婴儿期和老年期免疫指标都很低很接近,普通聚类他们很容易聚到一类,而有序聚类,婴儿期和老年期是不可能聚在一起的,中间隔着幼儿期、少年期、青年期、壮年期等。

使用道具

zzs92121 发表于 2014-1-6 17:54:21 |显示全部楼层 |坛友微信交流群
wsyxh 发表于 2014-1-6 12:20
有序数据的聚类,就是数据的前后顺序不能破坏,还要进行聚类分析。如:按照人一生各项的不同生理指标,把 ...
明白你的意思了,可惜我不会。建议去SAS里看下帮助,如果没有的话,估计是不能直接做了。

使用道具

13060563 发表于 2014-1-7 02:05:46 |显示全部楼层 |坛友微信交流群
有關「有序聚类分析」之SAS procedure完整範例,可參考胡良平(2012),面向問題的統計學(3),人民衛生,PP258-260.
經測試,該SAS procedure沒問題!
有志者,事竟成!

使用道具

wsyxh 发表于 2014-1-13 16:15:34 |显示全部楼层 |坛友微信交流群
还有一个叫DTWin的多元统计小软件也能做有序数据聚类,结果一样。

使用道具

mycpcw 发表于 2014-1-16 09:30:30 |显示全部楼层 |坛友微信交流群
学习了

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 07:57