2017-12-23 3 views
0

Ich habe einen Datenrahmen von Spezies mit unterschiedlichen Häufigkeiten und möchte sehen, ob ihre Häufigkeiten mit irgendeinem Parameter zusammenhängen.purrr mit linearem Modell in R: ungültiges 'envir' Argument vom Typ 'character'

Ich glaube, ich sollte in der Lage sein, so etwas wie

# Load in the dune data set and tidyverse 
library(vegan) 
data(dune) 
data(dune.env) 
library(tidyverse) 

# Reshape the species matrix into long form data 
duneM <- dune %>% rownames_to_column('Site') %>% gather(Species, Count, -Site) 

# Join the species and environmental data 
duneE <- dune.env %>% rownames_to_column('Site') 
duneJ <- left_join(duneM, duneE, by = 'Site') 

# Basic linear model, that compares species counts to moisture data 
my_lm <- function(df){ 
    lm(Count ~ Moisture, data = df) 
} 

# Group the data by species and apply the function to each one 
duneJ %>% group_by('Species') %>% map(my_lm) 

Zu meiner Überraschung zu tun, ich bin die folgende Fehlermeldung zu bekommen.

Fehler bei eval (predvars, Daten, env): ungültige 'envir' Argumente vom Typ 'Charakter' Traceback:

  1. duneJ%>% group_by ("Species")%>% Karte (my_lm)
  2. withVisible (eval (Zitat (`_fseq` (` _lhs`)), env, env))
  3. eval (Zitat (`_fseq` (` _lhs`)), env, env)
  4. eval (Zitat (`_fseq` (` _lhs`)), env, env)
  5. ` _fseq` (`_lhs`)
  6. freduce (Wert,` _function_list`)
  7. withVisible (function_list [k])
  8. function_list [k]
  9. Karte (., my_lm)
  10. .f (.x [[i]], ...)
  11. lm (Count ~ Moisture, data = df) in Zeile # 2 der Datei
  12. eval (mf, parent.frame())
  13. eval (mf , elter.frame())
  14. stats :: model.fra me (Formel = Count ~ Moisture, data = df, drop.unused.levels = TRUE)
  15. model.frame.default (Formel = Count ~ Moisture, data = df, drop.unused.levels = TRUE)
  16. eval (predvars, Daten, env)

klar, ich bin hier fehlt etwas. Könnte jemand bitte klarstellen? Vielen Dank.

+0

Erwartet einen Datenrahmen. Versuchen Sie 'duneJ%>% group_by (Species)%>% summieren (lm = list (my_lm (.)))' –

+0

Danke. Während das tatsächlich läuft, bin ich mir nicht sicher, was ich mit der Ausgabe machen soll. Ich hatte geplant, etwas wie 'duneJ%>% group_by (' Species ')%>% map (my_lm)%>% broom :: ordy' zu machen, um einen Datenrahmen von Koeffizienten und p-Werten zu erhalten. – ohnoplus

+0

Ich dachte viel von dem Punkt der Karte war, dass es mit Objekten umgehen konnte, die keine Datenrahmen sind, und dann konnten wir den Datenrahmen in einem letzten Schritt mit etwas wie map_df (broom :: ordnung) – ohnoplus

Antwort

0

Es hat mir geholfen, diesen Beitrag http://omaymas.github.io/Climate_Change_ExpAnalysis/ zu betrachten, und dieses Video https://www.youtube.com/watch?v=rz3_FDVt9eg zu verstehen, wie man am besten purrr und Besen zusammen verwendet. Wie G. Grothendeik hervorhebt, kann ich eine Spalte mit Modellen zu einem Datenrahmen hinzufügen (wobei jede Zelle ein vollständiges Modell ist). Die Art und Weise dies mit der Kartenfunktion zu tun ist,

duneJ %>% group_by(Species) %>% nest %>% mutate(Mod = map(data, my_lm0)) -> test 

Hier ist nest eine Schlüsselfunktion, die eine Spalte macht, die eine Liste von Datenrahmen ist, von denen jeder die Daten zu den einzelnen Arten enthalten und speichert sie in eine Standardspalte namens "Daten". Ich starte map innerhalb der Mutate-Funktion, um die Modelle in einer weiteren Spalte zu speichern, in der jede Zelle ein neues Modell ist.

Wenn ich bei Modellergebnissen aussehen will, kann ich sie in eine Liste von Datenrahmen mit Karte und Besen kombinieren, die relevanten Daten auswählen und dann unnest sie, etwa so:

test %>% mutate(Glance = map(Mod, glance)) %>% select(Species, Glance) %>% unnest 

Dies wird Ich habe einen neuen Datenrahmen, der Modellresultate für jede Art hat, was ich letztendlich anstrebte, auch wenn ich das in der Frage nicht vollständig erklärt habe.

Verwandte Themen