Implementieren einer Formel
Re: Implementieren einer Formel
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 ://?
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 ://?
Re: Implementieren einer Formel
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)
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
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)
klar - das bedeutet: die Funktion ist syntaktisch richtig.jjj hat geschrieben: ↑Fr Jan 29, 2021 8:56 pm Ich habe die Funktion nun folgenderaßen eingefügt:
so wird sie auch zum ersten Mal akzeptiert.Code: Alles auswählen
rel.info = function(x){ h <- x / sum(x) return( - sum(h/log(h)) / log(length(h))) }
Warum soll das gewünschte Ergebnis 1 sein?Nun kann ich jedoch nicht einfach rel.info(data$geschlecht) tippen und das gewünschte Ergebnis von 1 bekommen.
das ist klar, weil data$geschlecht ein Faktor ist.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
ups, so viele miteinander verquickte Fragen, grrrIst 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 ://?
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
Re: Implementieren einer Formel
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:
oder so:
Gruß, Jörg
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))
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)
Re: Implementieren einer Formel
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:
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:
----------------------------------------------------------------------------------------------------
Hoffe, ich habe die Codes dieses Mal richtig eingegeben.
Danke im Voraus!
Liebe Grüsse
Thomas
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)
}
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
Re: Implementieren einer Formel
Hallo Thomas,
ja, da ist irgendwo der Wurm drin es sollte eher so wie dies aussehen:
... Test, Test, ... alles klar, so ist es richtig:
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:
Gruß, Jörg
p.s.:
Nach "Dispersionsmaß des relativen Informationsgehalts" googeln liefert auch eine tolle Lösung.
https://pandar.netlify.app/post/r-deskriptiv/
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)
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))
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)
p.s.:
Nach "Dispersionsmaß des relativen Informationsgehalts" googeln liefert auch eine tolle Lösung.
https://pandar.netlify.app/post/r-deskriptiv/
Re: Implementieren einer Formel
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
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
Re: Implementieren einer Formel
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
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