Matematik
R-programmering: Problemer med funktioner + plots
Først: Beklager kategorien. Der findes ingen "programmerings-kategori". Og synes ikke IT passede.
Jeg ønsker at implementere R i stedet for excel. Primært fordi output er så meget pænere i R og sekundært fordi det er free-ware.
Dog har jeg (tilsyneladende) lidt problemer med syntaksen. Poster min "kode" senere. For nu vil jeg blot høre, om der er nogen, der anvender R, og som kan anbefale brugervenlig litteratur; skal gerne være eksempel-baseret.
Jeg har det lidt ligesom i TeX: Det er typisk lettere at rette i andres end at starte fra bunden.
PFT.
Svar #1
18. februar 2010 af sigmund (Slettet)
Jeg bruger ikke selv R, men "smagte" kortvarigt på det i forbindelse med et statistikkursus på universitetet. Jeg synes, at det er godt at du indser, at Excel-grafik ikke er særlig pæn. Og så er det selvfølgelig et stort plus, at det er open-source freeware.
Mht. litteratur, så fandt jeg dette, som ser ud til at være udmærket til at få et indledende kendskab til R. Ellers synes jeg, at denne bog er udmærket som en "lærebog" i R. Det er godt nok en statistikbog, men R fylder meget i fremstillingen. Og så får du et exempelbaseret stykke litteratur. Den "officielle" introduktion til R finder du her. Kig på disse dokumenter og prøv dig frem. Den bedste måde at lære et programmeringssprog er at anvende det til løsning af konkrete opgaver.
Svar #2
18. februar 2010 af hund (Slettet)
Stor tak.
Jeg har forsøgt mig med følgende:
CallBS <- function(V, D, T, Sigma, r){
d1 <- (log(V/K)+(r+1/2*Sigma^2)*T)/(Sigma*sqrt(T))
d2 <- d1+Sigma*sqrt(T)
Call <- V*pnorm(d1)-D*exp(-r*T)*pnorm(d2)
return(Call)
}
V <- 0:200
D <- 130
T <- 1
Sigma <- 0.2
r <- 0.05
S <- CallBS(V, D, T, Sigma, r)
print(S)
plot(S)
Idéen er, at jeg skal plotte (call-)funktionen som funktion af værdier af V (fra 0 -> 200), men plotter stemmer ingenlunde overens med det jeg får i Excel. Har jeg misforstået noget?
Svar #3
19. februar 2010 af sigmund (Slettet)
Det kan være, at du har misfortstået noget. Hvor stammer den funktion fra? Og er du klar over, hvad pnorm() laver? Kan du forklare nærmere om den funktion, du skal plotte? Og hvordan skal det rigtige plot se ud? (vedhæft en figur)
Svar #4
19. februar 2010 af sigmund (Slettet)
Men lige tre ting i forhold til din kode: 1) du har glemt at give K en værdi, 2) det er ikke nødvendigt med print(S) og 3) skriv plot(V,S) for at få den rigtige skalering af akserne.
Svar #5
19. februar 2010 af hund (Slettet)
Problemet var K'et. Nu virker det. Super!
pnorm() skulle gerne være det man normalt kender som N() (cdf()).
Nu har jeg blot ét problem (indtil videre). Kan kun få mit plot i tre grafer under hinanden, ikke - som jeg vil - i samme graf. Her er min kode:
--------------------------------------------
CallBS <- function(V, D, T, Sigma, r){
d1 <- (log(V/D)+(r+1/2*Sigma^2)*T)/(Sigma*sqrt(T))
d2 <- d1-Sigma*sqrt(T)
Call <- V*pnorm(d1)-D*exp(-r*T)*pnorm(d2)
return(Call)
}
V <- 0:200
D <- 100
T <- 1
Sigma <- 0.2
r <- 0.05
S <- CallBS(V, D, T, Sigma, r)
plot(V, S, type = "l", col = 2, main = "Variation i egenkapital ved variation af V")
#1=sort, 2=rød, 3=grøn, 4=blå,
#5=lyseblå, 6=lilla, 7=gul
#8=grå
Ds <- 50
DSenior <- V-CallBS(V, Ds, T, Sigma, r)
plot(V, DSenior, type = "l", col = 3, main = "Variation i seniorgæld ved variation af V")
Dj <- 50
DJunior <- CallBS(V, Ds, T, Sigma, r)-CallBS(V, Ds+Dj, T, Sigma, r)
plot(V, DJunior, type = "l", col = 4, main = "Variation i juniorgæld ved variation af V")
par(mfrow = c(3,1))
--------------------------------------------
- Jeg er klar over, at jeg be'r R om at grafe 3:1, men når jeg ikke gør det, får jeg blot det sidste plot.
Svar #6
19. februar 2010 af hund (Slettet)
Her er graf (erne) ved ikke lige hvorfor den laver så mange. But ya'll get tha picturaa
Svar #8
19. februar 2010 af sigmund (Slettet)
Jeg tror jeg har løst dit problem. Kør følgende script:
CallBS <- function(V, D, T, Sigma, r){
d1 <- (log(V/D)+(r+1/2*Sigma^2)*T)/(Sigma*sqrt(T))
d2 <- d1-Sigma*sqrt(T)
Call <- V*pnorm(d1)-D*exp(-r*T)*pnorm(d2)
return(Call)
}
V <- 0:200
D <- 100
T <- 1
Sigma <- 0.2
r <- 0.05
S <- CallBS(V, D, T, Sigma, r)
g_range <- range(0, S) #returnerer et [Smin,Smax] interval
plot(V, S, type = "l", col = 2, xlab = "V", ylab = "")
#1=sort, 2=rød, 3=grøn, 4=blå,
#5=lyseblå, 6=lilla, 7=gul
#8=grå
Ds <- 50
DSenior <- V-CallBS(V, Ds, T, Sigma, r)
lines(DSenior, col = 3)
Dj <- 50
DJunior <- CallBS(V, Ds, T, Sigma, r)-CallBS(V, Ds+Dj, T, Sigma, r)
lines(DJunior, col = 4)
#en forklaring placeres i (0,Smax)
legend(0, g_range[2], c("Egenkapital","Seniorgæld","Juniorgæld"),
col=c(2,3,4),lty=1);
--------------------
Først dannes et plot med plot(), hvorefter de to andre grafer indsættes vha. lines(). Derudover placeres en "legend" i øverste venstre hjørne, der forklarer, hvad de enkelte grafer viser.
Svar #9
19. februar 2010 af hund (Slettet)
Nu ved jeg, hvorfor den lavede uendelig mange grafer. Havde ikke lige fået aktiveret "dev.off"
Når jeg kommer hjem vil jeg prøve, at lave en Monte Carlo-simulation. Vil prøve med:
#MC-sim
Nrep <- 30 #justér selv
z <- 0:Nrep
z <- runif(0,1,Nrep) #ved ikke om ovenstående er nødvendig. Ønsker egentlig blot at gøre plads til data i z
W <- 0:Nrep
W[0] <- 0 #min MC-sim skal starte i 0
#sim
for(in in Nrep-1){
if(z[i+1]>0.5) W[i+1] <- 1
else W[i+1] <- -1
W[i+2] <- W[i+1]
} #slut for-løkke
MC <- W
plot(t, MC, type="l")
Det er nok en lidt home made
Svar #12
20. februar 2010 af sigmund (Slettet)
Det er jeg glad for at høre.
Mht. din Monte Carlo-simulation, hvad indeholder vektoren z så? Hvilke tal? Og i din for-løkke, så kan du ikke skrive for(i in Nrep-1); det må være for(i in 0:Nrep-1), fordi i skal gennemløbe en række værdier. for(i in Nrep-1) betyder, at i kun antager værdien Nrep-1 (men så er for-løkken overflødig).
Svar #13
24. februar 2010 af hund (Slettet)
Har ikke haft en stund til at arbejde videre med MC-sim.
Vil dog høre dig om en anden ting: Er du bekendt med Rs statistik-pakke? Helt konkret kunne jeg godt tænke mig at vide, hvorledes jeg skal tolke noget af al den info glm() spytter ud.
Ved >summary(glm.xxx) får man en farlig masse ting ud, bl.a. "Signif codes:" - hvordan tolkes/anvendes disse?
Tak
Svar #14
24. februar 2010 af hund (Slettet)
A la this:
Call:
glm(formula = y ~ x)
Deviance Residuals:
Min 1Q Median 3Q Max
-4.8181 -2.4615 0.1386 2.1627 5.1193
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.814402 0.572699 8.407 3.42e-13 ***
x 0.001013 0.009846 0.103 0.918
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 8.07723)
Null deviance: 791.65 on 99 degrees of freedom
Residual deviance: 791.57 on 98 degrees of freedom
AIC: 496.67
Number of Fisher Scoring iterations: 2
Svar #15
25. februar 2010 af hund (Slettet)
Ok, det er rimelig grimt. Data er lavet således:
y <- runif(100,0,10)
x <- 1:100
Svar #16
03. marts 2010 af sigmund (Slettet)
Jeg er ikke godt bekendt med Rs statistikpakke, nej. Mht. de "signif. codes" (significance codes), så betyder det bare, at hvis der står *** bag et tal, så er det signifikant på signifikansniveau 0; hvis der står **, så er tallet signifikant på signifikansniveau 0.001; jeg tror du kan se mønsteret nu.
Svar #17
17. marts 2010 af hund (Slettet)
Endnu engang: Tak!
Jeg skal nu til at skrive en rapport med output fra R - har du en nem måde, at få selve outputtet ind i en, say, TeX-fil?
Svar #18
18. marts 2010 af sigmund (Slettet)
Jeg har ingen erfaring med at inkludere output fra R i (La)TeX. Jeg har dog fundet frem til et system, der ser imponerende ud: http://www.statistik.lmu.de/~leisch/Sweave/. Det skulle nok kunne løse dit problem, da det ser ud til at være en forholdsvis nem måde at kombinere R og LaTeX.
Skriv et svar til: R-programmering: Problemer med funktioner + plots
Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk?
Klik her for at oprette en bruger.
