Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

R Dili ile İstatistiksel Programlama

Benzer bir sunumlar


... konulu sunumlar: "R Dili ile İstatistiksel Programlama"— Sunum transkripti:

1 R Dili ile İstatistiksel Programlama
Yard.Doç.Dr. Mehmet Hakan Satman – İstanbul Üniversitesi Ekonometri Bölümü, 2012

2 R Dili ile İstatistiksel Programlama
R, istatistikçiler için tasarlanmış mesleğe özel bir dil ve bir programlama ortamıdır. GPL (GNU Public License) ile dağıtılır. Windows, Linux ve MacOsX için derlenmiş kod ve binlerce paket indirilip kurulmaya hazırdır.

3 Paketler R'de harici ve dahili olmak üzere yaklaşık adet paket bulunur. Bu paketler büyük oranda GPL ve LGPL ile lisanslanmıştır. Paketler program üzerinden kolaylıkla kurulur. Derleme ve yükleme aşamalarında çoğu zaman kullanıcı müdahalesi gerekmez.

4 Dahili Paketler base (mean, median, var, cov, cor, ...)
graphics (plot, points, lines, ...) stats (princomp, factanal, kmeans, …) utils (read.csv, unzip, read.table, …) compiler (bytecode compiler) datasets

5 Harici Paketler REPL (Read-Eval-Print Loop) interpreter üzerinden install.packages(“paketadı”) ifadesiyle indirilip kurulurlar. Adresinden tüm paketlerin bir listesi ve açıklamaları elde edilebilir. Yüklenen paketler sonradan require(“paketadı”) ifadesiyle çağırılır.

6 Harici Paketler Zaman serileri Robust istatistik
Çok değişkenli istatistik Bio-istatistik Optimizasyon Yapay zeka Paralel programlama vs.

7 Dil Vektör ve matrisler üzerinde işlem yapabilme Dahili ~700 fonksiyon
Binlerce harici paket C dil yapısına benzerlik C, C++, Fortran ve Java'dan kütüphane dahil edebilme özelliği

8 Değişken Tipleri R'de değişkenler; integer double character logical
complex olabilir. Bu değişkenlerin vektörleri de birer değişken tipi gibi davranır.

9 Değişken Tipleri > a<-3 > typeof(a) [1] "double" > class(a) [1] "numeric" > > b<-"Hi!" > typeof(b) [1] "character" > class(b) Typeof fonksiyonu ile değişkenin hangi primitif tipe sahip olduğu bilgisi alınırken, class ile değişkenin OOP anlamında sınıf bilgisine ulaşılır.

10 Fonksiyonel Dil Özellikleri
Parametreler fonksiyonlara istenilen sırada ve isimle aktarılabilir: Topla ← function(a,b){ return(a+b) } A ← Topla (a=8, b=10) B ← Topla (b=10, a=8) print(A == B) Sonuç: TRUE

11 Fonksiyonel Dil Özellikleri
Varsayılan parametre değerleri, fonksiyon tanımlanırken belirlenebilir: Power ← function (x, p=2) { return ( x ^ p ) } print (Power(10)) Sonuç: 100

12 Değer ile Gönderme Parametreler, eğer yerleşik R tipleri ise fonksiyonlara değer olarak aktarılır. f<-function(x){ x<-10 } a<-20 f(a) print(a) Sonuç: 20

13 Değer ile Gönderme R'nin bu davranışı Java ile benzerdir. Java'nın primitif değişken tipleri olan double, int, float, byte, boolean, char, long, short fonksiyonlara değerleri ile aktarılırken, tüm nesneler referans ile aktarılır. R'de de referans ile aktarım, nesne yönelimli programlama ile mümkün olur.

14 Öz yineleme (Recursion)
Factorial ← function (x){ if(x <= 1) { return (1) }else{ return ( x * Factorial(x - 1) ) } print ( Factorial(5)) 120

15 Vektörler Dilin Dahili Elemanlarıdır!
> x <- 1:7 > print(x) [1] > y <- rep(5,10) > y [1] > z <- x * 10 > z [1] > length(z) [1] 7 > z[1] [1] 10 > z[1:3] [1]

16 Matrisler ve Uzantıları
Vektörler matrislere kolayca dönüştürülebilir: > x<-1:9 > print(x) [1] > dim(x) <- c(3,3) > x [,1] [,2] [,3] [1,] [2,] [3,]

17 Matrisler ve Uzantıları
> x<-1:9 > print(x) [1] > A<-matrix(x, byrow=TRUE, nrow=3, ncol=3) > A [,1] [,2] [,3] [1,] [2,] [3,]

18 Listeler Matrislerde her satır için eşit sayıda sütun elemanı veya her sütun için eşit sayıda satır elemanı yer alır. Listeler matrislere benzeyen veri yapılarıdır. Ancak her bir liste elemanı farklı boyutlardaki vektörlerden oluşabilir. Bir liste başka bir listeyi eleman olarak tutabilir.

19 Listeler > alist <- list( a="string variable", b=5, c = c(1,2,3), d=list(7,8,9)) > alist $a [1] "string variable" $b [1] 5 $c [1] 1 2 3 $d $d[[1]] [1] 7 $d[[2]] [1] 8 $d[[3]] [1] 9

20 Listeler Listeler C++ 'daki map<?,?> taslaklarına benzer şekilde dizayn edildiğinden, liste elemanlarına indisler veya anahtarlarla erişilebilir. > print(alist[1]) $a [1] "string variable" > print(alist["c"]) $c [1] 1 2 3

21 Listeler Listeler C++ 'daki map<?,?>::iterator taslağında olduğu gibi döngü elemanına dönüştürülebilir. for (i in alist){ print(i) } Tüm elemanlar sırayla “i” değişkeninde saklanır.

22 Sınıf ve Nesneler Sınıflar soyut veri yapılarıdır.
Bir sınıf için bellekte yer ayrıldığı anda bir nesne elde edilmiş olur. Nesnelere referans ile erişim mümkün olur.

23 Sınıflar public class MyClass { public String name; }
setClass("MyClass", representation( name="character" )

24 Nesneler MyClass mc; mc = new MyClass(); mc.name = “Fuzuli”;
mc <-new("MyClass",name="Fuzuli") ← ”Fuzuli” Java'da varsayılan olarak nesnelerle ilgili tüm işlemlerde referans ile erişim sağlanır. Mc, MyClass sınıfından örneklendirilen bir sınıftır. Fonksiyonlara parametre olarak gönderildiğinde referans olarak gönderilir. Ancak nesneye ait bir veri değiştirilirse nesnenin kopyası oluşturulur. Yalnızca referans ile erişim gerekliyse setRefClass kullanılmalıdır.

25 Referans ile Erişim setRefClass("MyClass", fields=list(
name="character" ) obj1<-new("MyClass", name="Fuzuli") f<-function(x){ x$name = "Degisti!" } f(obj1) obj1$name Sonuç: obj1$name değişkeni fonksiyon için değişir.

26 C / C++ ile etkileşim R, büyük oranda C ile; kısmen de R ile yazılmıştır. R'den dinamik kütüphane olarak derlenmiş ve herhangi bir dilde yazılmış binary kütüphaneler çağırılabilir. Bu kütüphaneler büyük oranda Fortran, C ve C++ 'da yazılıp derlenmiştir.

27 C++ C++ fonksiyonları, R 'den çağırılabilecek şekilde tanımlanmalıdır:
extern “C” { const char *concat(const char *, const char *); } const char *concat(const char *c1, const char *c2){ string s1 = string(c1); string s2 = string(c2); stringstream ss; ss<<s1<<s2; return(ss.str().c_str()); Sample.cpp

28 C : MySum Fonksiyonu MySum.c #include <R.h>
#include <Rdefines.h> SEXP MySum (SEXP pnum1, SEXP pnum2, SEXP result, SEXP env){ double num1 = NUMERIC_POINTER (pnum1)[0]; double num2 = NUMERIC_POINTER (pnum2)[0]; NUMERIC_POINTER (result)[0] = num1 + num2; return(result); } MySum.c

29 MySum.c 'nin Derlenmesi İşletim sistemi konsolu $ R CMD SHLIB MySum.c
gcc -std=gnu99 -I/usr/share/R/include fpic -O3 -pipe -g -c MySum.c -o MySum.o gcc -std=gnu99 -shared -o MySum.so MySum.o -L/usr/lib/R/lib -lR $ İşletim sistemi konsolu

30 MySum.so Derleme sonrasında işletim sistemi Linux ise MySum.so, Windows ise MySum.dll dosyaları oluşur. Dinamik kütüphane fonksiyonları sayesinde söz konusu binary kütüphane içinde yer alan tüm fonksiyonlar R'den çağırılabilir.

31 MySum 'ın R'den çağırılması
> dyn.load("MySum.so") > a<-as.double(9) > b<-as.double(5) > c<-as.double(0) > .Call("MySum",a,b,c,.GlobalEnv) [1] 14 > print(c) 14

32 C 'den R fonksiyonları çağırma
Bootstrap ve Genetik algoritma gibi yöntemler belirli bir istatistiğin veya uygunluk değerinin hesaplanması için algoritma dışında tanımlanmış bir fonksiyona ihtiyaç duyarlar. Algoritma C veya C++ 'da yazılmışken, bu algoritma dışı fonksiyon R'de yazılmış olabilir. Bu bağlamda harici dillerden R fonksiyonlarının çağırılabilmesi oldukça önemlidir.

33 C'den R Fonksiyonları Çağırma
SEXP fn, sexp_fvec, result; fn = lang2 (evalFunc, par); sexp_fvec = eval (fn, env); result = NUMERIC_POINTER (sexp_fvec)[0];

34 Java ile Etkileşim R, C'de yazıldığından Java ile dolaysız olarak etkileşime giremez. Ancak Java büyük oranda C'de yazıldığı için R içinde bir dinamik kütüphane yardımıyla bir Java sanal makinesi belleğe yüklenip çalışır hale getirilebilir. Java'da onlarca matematik ve istatistik alanı için yazılmış kütüphaneden bu şekilde faydalanılır. Örneğin Rweka, Weka adlı Java kütüphanesi için yazılmış bir örtü pakettir.

35 rJava paketi Rjava, JNI (Java Native Interface) arabirimini kullanarak Java'da yazılıp derlenmiş sınıfların örneklendirilmesine ve örnekler için fonksiyonların çağırılabilmesine hizmet eder. R içinden install.packages(“rJava”) yazılarak kolayca kurulabilir. Ancak paket, Java'dan R fonksiyonlarını çağırma konusunda aynı kolaylığı sunmaz.

36 rJava Örneği > require("rJava") > jvm <- .jinit()
> str <- .jnew("java.lang.String", "Hi!") > .jcall(str, method="toString",returnSig="Ljava/lang/String;") [1] "Hi!"

37 Java'dan R Çağırma JRI (Java R Interface) JNI arabirimi ile Java'dan R fonksiyonlarının çağırılması için kullanılmaktadır. Başlangıç ve orta düzey kullanıcılar için çalıştırma işlemine hazır hale getirme işlemleri zor olabilir. Rserve, R içinden açılan sunucu soketler yardımıyla çalışır. Böylece soket kütüphanesine sahip herhangi bir dilden R'ye ulaşılabilir. Java ve Php'den bu yolla R fonksiyonlarına ulaşılabilir.

38 RCaller R hakkında daha az fikir sahibi Java programcıları tarafından tercih edilebilir. Java'dan R çağırma ile ilgili basit bir çözüm yaklaşımı sunar. Açılan bir R prosesi üzerinden komutların gönderilmesi, çıktıların ise XML formatına dönüştürülüp ayrıştırılması temeline dayanır. LGPL lisansı ile bir çok ticari Java uygulamasının R ile entegrasyonu sağlanmıştır.

39 RCaller RCaller caller = new RCaller(); RCode code = new RCode();
caller.setRscriptExecutable("/usr/bin/Rscript"); double[] x = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; double[] y = new double[]{2, 4, 6, 8, 10, 12, 14, 16, 18, 30}; code.addDoubleArray("x", x); code.addDoubleArray("y", y); code.addRCode("ols<-lm(y~x)"); caller.setRCode(code); caller.runAndReturnResult("ols"); double[] residuals = caller.getParser().getAsDoubleArray("residuals"); double[] coefficients = caller.getParser().getAsDoubleArray("coefficients"); double[] fitteds = caller.getParser().getAsDoubleArray("fitted_values");

40 RCallerPhp RcallerPhp, Java API 'ye benzer bir şekilde R fonksiyonlarının Php 'den çağırılabilmesine olanak tanır. Arka planda istatistiksel hesap ve raporlama yapan web projelerinin önceden yazılmış etkin fonksiyonları çağırabilmesi yolu açılmış olur. Web arayüzü ve uygulama katmanları kolaylıkla ayrılabilir.

41 RCallerPhp 1 <?php 2 include_once ("RCaller.php"); 3
4 $rcaller = new RCaller(); 5 $rcaller->setRscriptExecutable("/usr/bin/Rscript"); 6 $rcode = new RCode(""); 7 $rcode->clear(); 8 $rcode->addRCode("mylist <- list(x=1:3, y=c(7,8,9))"); 9 10 $rcaller->setRCode($rcode); 11 $rcaller->runAndReturnResult("mylist"); 12 13 $x = $rcaller->getParser()->getAsStringArray("x"); 14 $y = $rcaller->getParser()->getAsStringArray("y"); 15 16 echo ("X is <br>"); 17 print_r ($x); 18 19 echo ("<br><br>Y is <br>"); 20 print_r ($y); 21 ?>

42 Diğer implementasyonlar
R, bir kısmı R 'de yazılmış bir programlama ortamıdır. Eğer yorumlayıcı kısmı başka bir platformda yeniden yazılabilirse, R ile yazılan kısmın yeniden yazılmasına gerek kalmaz. Örneğin renjin, R dilinin Java implementasyonudur. Yorumlayıcı kod Java'ya dönüştürülmüştür.

43 renjin Renjin projesine adresinden erişilebilir. Java'nın çalışabildiği herhangi bir ortamda (Google app engine, Glassfish, Desktop, Android) R programlarının çalışabilmesi amaçlanır. Büyük oranda orijinal interpreter'ın Java koduna dönüştürülmesi yoluyla yazılmaktadır. Yapım aşamasındadır

44 Sorular?


"R Dili ile İstatistiksel Programlama" indir ppt

Benzer bir sunumlar


Google Reklamları