Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Etudiant en M1...donc débutant en sas !!! je souhaite faire des opérations sur matrices... mon but est de créer un vecteur (n,1) qui resulte du produit d'une matrice de distances (n,n) composée de distances faites à partir de 2 var X et Y ( coordonnées de mes points=maisons ) et d'un vectreur (n,1) construit avec une var AC (Air Conditioning). ces var sont dans la base sas.
je vous montre ce que j'ai fait pour l'instant (Et oN ne se moque pas!! lol ) :
data baltim;
infile 'C:\Documents and Settings\utilisateur\Bureau\baltim.txt' expandtabs;
input STATION PRICE NROOM DWELL NBATH PATIO FIREPL AC BMENT NSTOR GAR AGE CITCOU LOTSZ SQFT X Y ;
run;
proc gplot data=baltim; **je represente les maisons dans l'espace, c super beau :-S !! ca y ressemble vachement...anyway ;
plot Y*X;
run;
proc iml;
use baltim;
read all var _all_ into a;
**read all var {PRICE} into b; **ca c'est pour le mode var continues;
read all var {AC} into b; ** la je veux decaler une var qualitative, c'est celle que j'utilise pas la suite;
start decalvar(x) global(a);
nbrlin=nrow(a);
do i=1 to nbrlin;
ll=0;
do j=1 to nbrlin;
distij=sqrt((a[i,16]-a[j,17])**2+(a[i,16]-a[j,17])**2); **je calcul la dist entre le point i et le point j, ((xi-xj)²+(yi-yj)²)^(1/2);
vardecalj=distij*x[j]; **produit de cette dist avec le premier terme du vect AC, 'b' si on veut;
ll=ll+vardecali; **je somme ces produit pour avoir le 1er terme du vecteur de la var decalée;
end;
n=j(nbrlin,1,ll);** ah!! c la où je bloque, en fait je veux ecrire les ll un par un dans un veteur colonne de nbrlin,ce truc la ne marche pas..HELP !;
end;
return(n);
finish decalvar;
t=decalvar(b);
print t;
create price_decal FROM t ;
append FROM t ;
close price_decal ;
quit;
data baltim1;
merge baltim price_decal;
run;
proc print;run;
** logit spatial ;
proc logistic data=baltim1;
class NROOM NBATH PATIO FIREPL GAR CITCOU;
model AC = PRICE NROOM NBATH PATIO FIREPL GAR AGE CITCOU LOTSZ SQFT COL1; **COL1 est le vecteur que g calculé avec la proc iml,c la var AC spatialement decalée, enfin ici c plus un vecteur c des obs. le reste c des var explicatives et AC c'est soit 1 si ya clim 0 sinon;
run;
ici c juste un test pour le logit spatial cette proc est loin d'etre efficace, en fait le probleme est bien plus complex au niveau de l'estimation, car d'une part on ne connait pas la distrib des erreus, il y a 1 probleme d'heteroscedasticité et puis même la vraisemblance a une sale geule, donc newton-raphson ne correspond pas !!
donc il faut utiliser une autre proc iml pour coder une estimation par PMV (pseudo maxi de vraisemblance) puis la maximiser avec l'algo de Marquardt –Levenberg (par exemple). où si on veux faire ca bien utiliser les MCMC (mission quasi impossible !!! ). mais bon j'en suis pas encore la.
voila !! si possible de m'aider pour l'instant à resoudre ce probleme de creation de vecteur, en plus il doit y avoir plus simple comme methode. MERCI
Hors ligne
une proc iml hahaha je vois que les m1 s'y sont mis aussi ^^
une petite question: pourquoi tu ne crées pas n comme une matrice ( genre: n=j(nbrlin,1,0)) au debut de ton programme (apres la création de nbrlin bien sur ) et apres tu remplis ta matrice n a chaque tour de ta boucle
(genre: n[i,1]=ll) ?
c'est le matin j'ai lu vite fais ^^ mais je pense que tu a deja essayé de faire cela non ?
j'essayerais de m'y pencher plus quand je serais plus reveiller
les autres vous pouvez aider aussi ^^
Dernière modification par 20syl (09-03-2007 09:50:41)
Hors ligne
Je suis d'accord avec Sylvain.
J'aurais aussi fait comme ça mais avec n[j,1]=ll !!!!
Hors ligne
C'est parfait !
je me suis trop pris la tete sur mon prog d'avant en fait y avait plus simple !
en sortant du td de Mr Tokpavi vendredi (2h de proc iml...j'avoue il a un peu depassé les 1h30 reglementaires du td! ) et bien sur en ayant vu vos reponses ! d'ailleurs je vous remerci énormément pour votre attention j'ai touver ca :
data baltim;
infile 'C:\Documents and Settings\utilisateur\Bureau\baltim.txt' expandtabs;
input STATION PRICE NROOM DWELL NBATH PATIO FIREPL AC BMENT NSTOR GAR AGE CITCOU LOTSZ SQFT X Y ;
run;
bon ca c pas nouveau..
proc gplot data=baltim;
plot Y*X;
run;
ca non plus..
proc iml;
use baltim;
read all var _all_ into a;
nbrlin=nrow(a);
n=j(nbrlin,nbrlin,0); ** voila g fait comme vous m'avez dit !! ;
do i=1 to nbrlin;
do j=1 to nbrlin;
distij=sqrt((a[i,16]-a[j,16])##2+(a[i,17]-a[j,17])##2);
n[i,j]=distij; ** et hop !
end;
end;
print n; ** et ca marche !!
create matrice_dist FROM n ;
append FROM n ;
close matrice_dist ;
quit;
voila g une matrice de distance toute belle !
data baltim1; ** je met ca dans un fichier avec les stations (ca peut etre le nom par exemple, mais ici c que des chiffres) pour que ca soit plus élegant !;
merge baltim matrice_dist;
keep STATION col1-col211;
run;
Ce qui suit est tout simplement formidable !!
proc modeclus data=baltim1 all m=1 r=10 out=prochevoisins;
id STATION ;
run;
proc print data=prochevoisins ;run;
Et oui SAS peut faire des etudes de cluster ! ici je peux voir quelles sont les plus proches voisins pour chaque station, il estime la densité dans l'espace! il fait meme des test ( H0(i): The number of population clusters is i or less VS Ha(i): The number of population clusters exceeds i ) plus pas mal d'options pour les etudes spatiales assez sympatiques !
...ca se trouver vous saviez deja lol mais bon moi de decouvre...
c bien beau tout ca mais bon c pas fini !
proc iml;
use baltim;
read all var {AC} into b;
use matrice_dist;
read all var _all_ into d;
nbrlin=nrow(d);
do i=1 to nbrlin;
do j=2 to nbrlin;
if d[i,j]<10 then d[i,j]=0; ** aprés etude du graph (gplot des y en fct des x) et les resultats de la proc modeclus je choisi de fixer la distance min à 10, au dela l'obs n'est plus considerée comme voisine, ce qui donne une sort de matrice des plus proches voisins ;
end;
end;
decalvar=d*b;
print decalvar;
quit;
data baltim1;
merge baltim price_decal; **note: pas besoin de mettre le 'by' tt est deja classé ;
run;
et puis en suite probit logit...etc !
ce qui serait bien aussi c'est de faire une marco pour generaliser ce programme à n'importe ql jeu de données! mais bon j'ai pas envi de me prendre trop la tete ! y a deja assez de boulot comme ca...à voir !
voila merci bcp pour votre ptite astuce elle m'as bien aider !! à plus tard !
trés bonne idée ce petit forum!
Hors ligne
petite correction...désolé !
proc iml;
use baltim;
read all var {AC} into b;
use matrice_dist;
read all var _all_ into d;
nbrlin=nrow(d);
do i=1 to nbrlin;
do j=1 to nbrlin;
if d[i,j]>10 then d[i,j]=0;
end;
end;
decalvar=d*b;
print decalvar;
quit;
Hors ligne