Seite 1 von 2

Mittel von Differenzen

Verfasst: Di Aug 11, 2020 11:34 am
von zinbu
Hallo zusammen,

für meine Hausarbeit habe ich einen Datensatz der etwas vereinfacht so aussieht:

Code: Alles auswählen

> str(df)
'data.frame':	13 obs. of  2 variables:
 $ ID   : num  1 1 2 2 2 2 3 3 3 4 ...
 $ score: num  13.2 12.4 14.7 14 13.2 12.9 13.6 13 12.3 14 ...
Also verschiedene Probanden die über eine gewisse Zeit unterschiedlich oft vermessen wurden und einen Punktewert in einem Score erhalten haben.

Ich möchte nun in einer 3. Spalte einen Wert für die mittlere Veränderung der Variable "score" für jede "ID", also 1 Wert für jede "ID"

Ich stehe echt auf dem Schlauch wie ich das am besten angehe :?

Vielen Dank schonmal!

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 12:53 pm
von bigben
Hallo!
zinbu hat geschrieben: Di Aug 11, 2020 11:34 amIch möchte nun in einer 3. Spalte einen Wert für die mittlere Veränderung der Variable "score" für jede "ID"
Was verstehst Du genau unter der mittleren Veränderung, wenn die Leute mehr als zweimal gemessen wurden?

LG,
Bernhard

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 2:46 pm
von EDi
Vielleicht ein Streuungsmaß?
Oder immer nur zur ersten Messung vergleichen und dann Mitteln?

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 3:35 pm
von zinbu
Ich will im Prinzip die Abnahme der Werte des Scores der einzelnen IDs von Wert zu Wert anschauen und dann einen Wert ermitteln, der mir die mittlere Abnahme über die Zeit anzeigt.

Am Ende will ich dadurch herausfinden, ob die Scores von IDs, die eine Behandlung bekommen haben, schneller kleiner werden als andere.

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 3:44 pm
von bigben
Mittlere Abnahme über die Zeit bei mehr als zwei Werten wäre dann beispielsweise die Steigung der Regressionsgerade durch die Werte jeder ID? Und die Zeiteinheit auf der x-Achse ist der Abstand zwischen zwei Messungen? Wenn Du eine Gruppe mit Behandlung einer Gruppe ohne Behandlung gegenüberstellen willst wäre es vielleicht sinnvoll, in den Datensatz eine Variable aufzunehmen die anzeigt, wer welche Behandlung erhalten hat? Ich kann mir schon vorstellen, dass Du diese Unterscheidung in einem zweiten Schritt machen wolltest, bin mir aber nicht sicher, ob man diesen Schritt nicht gleich hier mit reinnehmen sollte (man könnte sich da z. B. auch ein mixed effects model vorstellen mit einem random effect auf ID..?).
Reden wir in Wirklichkeit auch von 13 Beobachtungen, also weniger als 6 Individuen verteilt auf zwei Behandlungsgruppen oder hast Du mehr Beobachtungen?

LG,
Bernhard

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 3:56 pm
von bigben
Also, hier mal eine Beispiellösung. Ich habe eine Variable "time" dazu erfunden und manuell ergänzt. Sie zeigt an, wie oft eine ID schon gemessen wurde. Die Variable müsste man automatisch erzeugen, aber erstmal will ich hören, ob das so zum Problem passt:

Code: Alles auswählen

bsp <- data.frame(ID = as.factor(c(1, 1, 2, 2, 2, 2, 3, 3, 3)),
                 time = c(0, 1, 0, 1, 2, 3, 0, 1, 2),
                 score =c (13.2, 12.4, 14.7, 14, 13.2, 12.9, 13.6, 13, 12.3))
fit <- lm(score ~ ID:time + ID - 1, data = bsp)
summary(fit)
Das erzeugt für jede ID eine eigene Regressionsgerade mit einer eigenen Steigung und eine eigenen Intercept:

Code: Alles auswählen

> summary(fit)

Call:
lm(formula = score ~ ID:time + ID - 1, data = bsp)

Residuals:
       1        2        3        4        5        6        7        8        9 
 0.00000  0.00000  0.07000 -0.01000 -0.19000  0.13000 -0.01667  0.03333 -0.01667 

Coefficients:
         Estimate Std. Error t value Pr(>|t|)    
ID1      13.20000    0.14103  93.598 2.69e-06 ***
ID2      14.63000    0.11799 123.991 1.16e-06 ***
ID3      13.61667    0.12874 105.768 1.86e-06 ***
ID1:time -0.80000    0.19944  -4.011  0.02780 *  
ID2:time -0.62000    0.06307  -9.830  0.00224 ** 
ID3:time -0.65000    0.09972  -6.518  0.00734 ** 
Demnach wäre die durchschnittliche Zunahme von ID1 -0,8/Zeit, die von ID2 -0,62/Zeit und die von ID3 wäre -0,65/Zeit. Geht das in die richtige Richtung?

LG,
Bernhard

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 4:28 pm
von zinbu
Hallo Bernhard,
Genau so hatte ich mir das idealer Weise vorgestellt!

Allerdings hat der Datensatz ca. 50.000 Beobachtungen und ich kann auf meinem kleinen Notebook einen "Vektor der Größe 7.2 GB nicht allozieren."

Könnte ich das näherungsweise auch einfacher angehen, zb. mit einem Differenzenquotient der mir die Steigung der Geraden anzeigt, wenn man davon ausgeht, dass alles einigermaßen linear ist?

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 7:55 pm
von bigben
Geh RAM kaufen! Neee, Quatsch. Ist natürlich woanders schwer nachzustellen, aber probier das hier mal. Das macht viele kleine Regressionen statt einer riesigen:

Code: Alles auswählen

bsp <- data.frame(ID = as.factor(c(1, 1, 2, 2, 2, 2, 3, 3, 3)),
                  score =c (13.2, 12.4, 14.7, 14, 13.2, 12.9, 13.6, 13, 12.3))

sapply(split(bsp$score, bsp$ID), function(werte) coef(lm(werte ~ I(1:length(werte))))[2])
LG,
Bernhard

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 8:30 pm
von Athomas
und ich kann auf meinem kleinen Notebook einen "Vektor der Größe 7.2 GB nicht allozieren.
Dazu zwei Bemerkungen:
  • Das würde 144 kB pro Datensatz bedeuten - kann das sein? Wenn ja - muß das sein?
  • Wenn sowas passiert, kann es eine Folge davon sein, dass der RAM (durch Löschen vormals benutzter Bereiche) wie ein Schweizer Käse durchlöchert ist. R möchte sich einen fortlaufenden Bereich reservieren, und das kann in dieser Situation unmöglich sein - obwohl der freie Speicher in Summe locker ausreichen würde. Oft hilft es, die Funktion gc() (garbage collection) auszuführen!

Re: Mittel von Differenzen

Verfasst: Di Aug 11, 2020 9:19 pm
von zinbu
Die option mit sapply funktioniert. Cool :D

Habt ihr noch einen Tipp wie ich die Werte dann wieder in ein geeignetes Format bekomme, sodass ich sie wieder in einer Tabelle den IDs zuordnen kann?

Ich habe as.data.frame versucht, das ergibt aber nur die Werte ohne zuordenbare Namen..