Eine Matrix mit drei for Schleifen füllen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Samisahara

Eine Matrix mit drei for Schleifen füllen

Beitrag von Samisahara »

Liebes R-Forum,

mein Name ist Sami und ich bin neu hier. Ich habe in den letzten Tagen etwas mit meinem Code zu kämpfen und hoffe das ihr mir weiter helfen könnt :)

Ich würde gern eine Matrix mit möglichen Kombinationen an Werten von einer Funktion füllen, die ich anhand von drei for schleifen berechne.
Es handelt sich um die Parameter q1, q2 und w die durch jeweils eine for Schleife laufen und ob der Gesamtwert der Funktion SP größer/gleich 0 ist oder nicht.

Leider befüllt mir R die Matrix nur mit den ersten fünf Werten jeder einzelnen Variable.
Außerdem bekomme ich die Fehlermeldung
Fehler in `[<-`(`*tmp*`, index, , value = c(NA, NA, NA, 1)) :
Indizierung außerhalb der Grenzen

Könnt ihr mir weiterhelfen ?

Code: Alles auswählen

#Funktion für die SP/A-Theorie aufstellen
#Parameter der SP/A Funktion definieren

kpp= 10
kp1p= -10
D1 =1
D2 =0.5
D3 =0
SP <- function(q1,q2,w){
  value = ((w*1^(q1+1)+(1-w)*(1-(1-1)^(q2+1)))-(w*0.5^(q1+1)+(1-w)*(1-(1-0.5)^(q2+1))))*kp1p+((w*0.5^(q1+1)+(1-w)*(1-(1-0.5)^(q2+1)))-(w*0^(q1+1)+(1-w)*(1-(1-0)^(q2+1))))*kpp                                                               
  return(value)
}


# Berechnung der Matrix 

q1 = seq(from = 0, to = 4, by = 1)  #Werte für den Parameter q1
q2 = seq(from = 0, to = 4, by = 1)  #Werte für den Parameter q2
w = seq(from = 0, to = 0.8, by = 0.2)  #Werte für den Parameter w
index = 1
X = matrix(nrow = length(q1) * length(q2) * length(w) , # Matrix für die Werte definieren
           ncol = 4,
           NA)   

for (i in 1:length(q1)) {         #Schleife q1, erste Spalte der Matrix
  for (j in 1:length(q2)) {       #Schleife q2, zweite Spalte der Matrix
    for (k in 1:length(w)) {      #Schleife w, dritte Spalte der Matrix
      
      result = SP(q1[i], q2[j], w[k])         #Parameter zuweisen 
      gamble = result >= 0                     #Agent spielt nur wenn Wert positiv ist, vierte Spalte der Matrix
      X[index,] = c(q1[index], q2[index], w[index], gamble)
      index = index+1
    }
  }
}
Ich danke euch vielmals im voraus und wünsche noch einen schönen und angenehmen Vatertag!
Lg Sami
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Eine Matrix mit drei for Schleifen füllen

Beitrag von bigben »

Eine Matrix ist immer quadratisch. Du musst also in allen vier vorgesehenen Spalten gleich viele Zeilen haben. Deine Unterteilung in

Code: Alles auswählen

for (i in 1:length(q1)) {         #Schleife q1, erste Spalte der Matrix
  for (j in 1:length(q2)) {       #Schleife q2, zweite Spalte der Matrix
    for (k in 1:length(w)) {  
verstehe ich daher nicht.

Kannst Du nicht einfach mit einer einzigen for - Schleife der Form

Code: Alles auswählen

for(index in 1:4){
      result = SP(q1[index], q2[index], w[index])         
      gamble = result >= 0               
      X[index,] = c(q1[index], q2[index], w[index], gamble)
}
oder etwas ähnlichem, Deine Matrix füllen?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Eine Matrix mit drei for Schleifen füllen

Beitrag von jogo »

Hallo Sami,

willkommen im Forum!
Samisahara hat geschrieben: Do Mai 25, 2017 1:55 pmmein Name ist Sami und ich bin neu hier. Ich habe in den letzten Tagen etwas mit meinem Code zu kämpfen und hoffe das ihr mir weiter helfen könnt :)
Mein Name ist Jörg, ich bin schon ein klein wenig länger dabei.

Wie wäre es hiermit:

Code: Alles auswählen

kpp =  10
kp1p= -10
D1 = 1; D2 =0.5; D3 =0

SP <- function(q1,q2,w){
  value = ((w*1^(q1+1)+(1-w)*(1-(1-1)^(q2+1)))-(w*0.5^(q1+1)+(1-w)*(1-(1-0.5)^(q2+1))))*kp1p+((w*0.5^(q1+1)+(1-w)*(1-(1-0.5)^(q2+1)))-(w*0^(q1+1)+(1-w)*(1-(1-0)^(q2+1))))*kpp                                                               
  return(value)
}
dat <- expand.grid(q1=0:4, q2=0:4, w  = seq(from = 0, to = 0.8, by = 0.2))
dat$X      <- with(dat, SP(q1, q2, w))
dat$gamble <- dat$X >= 0
Noch ist allerdings nicht enthalten, dass Du nur die Fälle mit dat$gamble==TRUE behalten möchtest, aber das ist bei Bedarf schnell erledigt, z.B.

Code: Alles auswählen

dat[dat$gamble,]
An Deiner Funktion finde ich einige Teile recht merkwürdig:
1^(q1+1) oder (1-1)^(q2+1) oder 0^(q1+1) oder (1-0)^(q2+1)
Findest auch Du diese Teile merkwürdig?

Gruß, Jörg
Samisahara

Re: Eine Matrix mit drei for Schleifen füllen

Beitrag von Samisahara »

Erst einmal vielen vielen Dank euch beiden! Eure Tipps haben mir schon sehr weiter geholfen und ich bekomme nun alle Parameter Kombinationen.

Ich werde nun ein wenig rumspielen und dann versuchen die drei Variablen in einem 3D Plot abzubilden.
Ich wünsche euch noch einen schönen Freitag und hoffentlich bis bald,

Sami
Antworten