Seite 1 von 1

Eine Matrix mit drei for Schleifen füllen

Verfasst: Do Mai 25, 2017 1:55 pm
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

Re: Eine Matrix mit drei for Schleifen füllen

Verfasst: Do Mai 25, 2017 10:13 pm
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

Re: Eine Matrix mit drei for Schleifen füllen

Verfasst: Do Mai 25, 2017 11:35 pm
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

Re: Eine Matrix mit drei for Schleifen füllen

Verfasst: Fr Mai 26, 2017 1:23 pm
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