Implementieren einer Formel

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

jjj
Beiträge: 6
Registriert: Do Jan 28, 2021 12:26 am

Re: Implementieren einer Formel

Beitrag von jjj »

Ich habe die Funktion nun folgenderaßen eingefügt:

rel.info = function(x){h <- x / sum(x)
+ + return( - sum(h/log(h)) / log(length(h)))}

so wird sie auch zum ersten Mal akzeptiert.

Nun kann ich jedoch nicht einfach rel.info(data$geschlecht) tippen und das gewünschte Ergebnis von 1 bekommen.

Ich erhalte dann folgende Fehlermeldung:
Fehler in Summary.factor(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, :
‘sum’ not meaningful for factors

Ist die Funktion richtig und ist das Problem nur, dass meine Werte noch als Wörter (Male/Female) und nicht als Zahlen (1/0) vorliegen?
Oder ist beides falsch ://?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Implementieren einer Formel

Beitrag von jogo »

Hallo jjj,

bitte lies und halte Dich an: viewtopic.php?f=20&t=29
(ich musste schon mal Deine Nachricht bearbeiten und werde nicht mehr antworten, wenn Du mir das Lesen Deiner Nachrichten erschwerst, indem Du Dich nicht an die Regeln hier im Forum hältst)
jjj hat geschrieben: Fr Jan 29, 2021 8:56 pm Ich habe die Funktion nun folgenderaßen eingefügt:

Code: Alles auswählen

rel.info = function(x){
  h <- x / sum(x)
  return( -  sum(h/log(h)) / log(length(h)))
}
so wird sie auch zum ersten Mal akzeptiert.
klar - das bedeutet: die Funktion ist syntaktisch richtig.
Nun kann ich jedoch nicht einfach rel.info(data$geschlecht) tippen und das gewünschte Ergebnis von 1 bekommen.
Warum soll das gewünschte Ergebnis 1 sein?
Ich erhalte dann folgende Fehlermeldung:
Fehler in Summary.factor(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, :
‘sum’ not meaningful for factors
das ist klar, weil data$geschlecht ein Faktor ist.
Ist die Funktion richtig und ist das Problem nur, dass meine Werte noch als Wörter (Male/Female) und nicht als Zahlen (1/0) vorliegen?
Oder ist beides falsch ://?
ups, so viele miteinander verquickte Fragen, grrr
ob man eine nominal skalierte Variable mit "Male"/"Female" oder mit 0/1 oder 1/0 oder "xy"/"xx" kodiert ist wahlfrei und darf für die Aussage der Statistik keinen Einfluss haben.
Deshalb ist die Funktion falsch, weil Du eigentlich etwas anderes willst:
die relativen Häufigkeiten ergab sich aus der Zählung (=absolute Häufigkeiten) von "Male" und "Female". Du hast aber nicht gezählt, sondern einfach x/sum(x) gerechnet.

Gruß, Jörg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Implementieren einer Formel

Beitrag von jogo »

gestern war es recht spät,
heute werde ich mich weiter mit dem Thema beschäftigen. demnächst also mehr an dieser Stelle ... (siehe unten)

Ein erstes Lob darf ich Dir schon erteilen:
Du hast erstmalig in diesem Thema konkrete Zahlen bereitgestellt.
-- das mit den code-tags muss noch geübt werden. ;)

Gibt es auf der Webseite, wo die Daten liegen, auch die konkrete Aufgabenstellung?

...
schau mal, ob Dir dies gefällt:

Code: Alles auswählen

load(url("http://statistik-beratung.com/daten/PfhDataAufgaben2.RData"))
table(data$geschlecht)
prop.table(table(data$geschlecht))

rel.info = function(x){
  h <- x / sum(x)
  return( -  sum(h/log(h)) / log(length(h)))
}

rel.info(table(data$geschlecht))
oder so:

Code: Alles auswählen

rel.info2 <- function(x){
  h <- prop.table(table(data$geschlecht))
  - sum(h/log(h)) / log(length(h))
}

rel.info2(data$geschlecht)
Gruß, Jörg
jjj
Beiträge: 6
Registriert: Do Jan 28, 2021 12:26 am

Re: Implementieren einer Formel

Beitrag von jjj »

Hallo Jörg,

erstmal vieeelen lieben Dank für deine ambitionierte Unterstützung. Ich weiss nicht, was ich dazu sagen soll...

Entschuldige bitte die erschwerende Eingabe der Daten meinerseits.

Ich habe nun deine Befehle eingegeben. Es wirkt vorerst alles schlüssig und ich bekomme zum ersten Mal auch ein Ergebnis angezeigt, dieses ist nun aber --2,081369-- Die Aufgabenstellung gibt an, dass nach korrekter Implementierung das Ergebnis bei 1 liegen sollte. Die gesamte Aufgabe ist zu dem Dispersionsmaß des relativen Informationsgehalts. Da beide Geschlechter in der Tabelle gleich oft auftauchen (25 : 25) sollte das Ergebnis bei 1 liegen.
Hast du eventuell noch eine Vermutung, wo die Funktion denn hier in eine falsche Richtung geht?
Es soll also nur darum gehen, die vorgegebene Funktion zu verwenden und die unterstutzenden Befehle ( -- prop.table(),-- log() --, sum() -- ) zu verwenden.


Du fragtest zuvor ja nach der Aufgabenstellung, ich werde diese hier nochmals einfügen:

-------------------------------------------------------------------------------------------------
Aufgabe 3
Implementieren Sie folgende Formel in R:
Ein geeignetes aber unbekanntes Dispersionsmaß für Nominaldaten ist der sogenannte
relative Informationsgehalt. Dieser hat einen Wertebereich zwischen 0 und 1. Ein Wert von
0 stellt eine sehr homogene Stichprobe dar. Bei einem Wert von 1 sind die gewählten
Antworten über alle Kategorien gleich verteilt.
Dieser lässt mit Hilfe folgender Formel berechnen:

h = -\frac{1}{\ln(k)}*\sum_{j=1}^{k}h_{j}\ln(h_{j})

k stellt dabei die Anzahl der Antwortkategorien und hj die relative Häufigkeit der
verschiedenen Antwortkategorien dar. Im Folgenden soll diese Formel in R implementiert
werden.

Folgende Funktionen könnten für die Implementierung nützlich sein:
prop.table()
log()
sum()

Die implementierte Formel wird am Ende folgende Struktur haben:

Code: Alles auswählen

rel.info = function(x){
hj = prop.table(table(x))
[…]
return(h)
}
Um zu überprüfen, ob Sie die Formel richtig implementiert haben, können Sie
rel.info(data$geschlecht) eingeben. Dieser Befehl sollte zum Ergebnis 1 führen.

+ Daten erhält man über:

Code: Alles auswählen

load(url("http://statistik-beratung.com/daten/PfhDataAufgaben2.RData"))
----------------------------------------------------------------------------------------------------


Hoffe, ich habe die Codes dieses Mal richtig eingegeben.
Danke im Voraus!


Liebe Grüsse

Thomas
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Implementieren einer Formel

Beitrag von jogo »

Hallo Thomas,

ja, da ist irgendwo der Wurm drin es sollte eher so wie dies aussehen:

Code: Alles auswählen

h <- c(0.5, 0.5)
-sum(h*log(h))/log(2)
... Test, Test, ... alles klar, so ist es richtig:

Code: Alles auswählen

rel.info = function(x){
  h <- x / sum(x)
  return( -  sum(h*log(h)) / log(length(h)))
}
rel.info(c(25, 25))
bisher stand dort fehlerhafterweise: h/log(h) (uff, auch in meiner ersten Antwort zu dem Thema -- das werde ich korrigieren)

so schaut es dann insgesamt aus:

Code: Alles auswählen

load(url("http://statistik-beratung.com/daten/PfhDataAufgaben2.RData"))
table(data$geschlecht)
prop.table(table(data$geschlecht))

rel.info2 <- function(x){
  h <- prop.table(table(data$geschlecht))
  -  sum(h*log(h)) / log(length(h))
}

rel.info2(data$geschlecht)
Gruß, Jörg
p.s.:
Nach "Dispersionsmaß des relativen Informationsgehalts" googeln liefert auch eine tolle Lösung.
https://pandar.netlify.app/post/r-deskriptiv/
jjj
Beiträge: 6
Registriert: Do Jan 28, 2021 12:26 am

Re: Implementieren einer Formel

Beitrag von jjj »

Hallo Jörg,

weisst du, für dich war das nun nur eine Wiederholung deine bisherigen Wissens. Mir hast du aber so enorm weitergeholfen. Ich hab mir schon den Kopf zerbrochen und hatte die schlimmste Woche innerhalb der kompletten Covid-Zeit. Ich konnte nun alle meine Probleme wieder beheben bis zu dem letzten Punkt: Statistik. Nun gehe ich online und sehe deinen Beitrag, teste es aus und alles funktioniert einwandfrei. Du hast mir eines meiner größten Probleme behoben und dafür gesorgt, dass ich nun wieder positiv mit allem weitermachen kann. Ich schätze deine Unterstützung überaus und danke dir von Herzen dafür!

Ich bin mir sicher, dass mehrere Personen auch in Zukunft an dieser Aufgabe zu beissen haben, sie haben jetzt die Möglichkeit, den Verlauf hier online einzusehen und im Studium fortschreiten zu können.

Ich wünsche dir alles beste und hoffe, dass du die Zeiten gut überstehst.

Danke!!!!


Liebe Grüsse

Thomas
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Implementieren einer Formel

Beitrag von jogo »

Hallo Thomas,

vielen Dank für Deinen netten Worte!
schön, dass das nun doch noch alles so gut funktioniert hat.
Etwas peinlich ist mir das schon, dass so ein simpler Schreibfehler über 3 Jahre überdauern konnte. Die Ursache liegt aber auch in der mangelnden Mitarbeit der bisherigen Fragenden. Auch kannst Du so sehen, wie wichtig es war, dass Du an der Frage mitgearbeitet hast.

Am Ende habe ich auch noch etwas gelernt über die Verwandtschaft von Shannon-Index und relativem Informationsgehalt.

Auch Dir weiterhin alles Gute!
Jörg
Antworten