Seite 1 von 1

Geographisch gewichtete Regression

Verfasst: Mi Feb 20, 2019 12:09 pm
von Christoph
Hallo zusammen,

ich erarbeite momentan eine geographisch gewichtete Regression, bei der mit 90% des Datensatzes das Modell gerechnet werden soll und für 10% die Werte vorhergesagt werden sollen. Dafür habe ich folgendes geschrieben:

Code: Alles auswählen

Daten<-rgdal::readOGR('Beispiel.shp')

#Ziehen der zufälligen 10%
zufall<-sample(1:nrow(Daten),0.1*nrow(Daten),replace = FALSE)
Daten10<-Daten[zufall,]
Daten90<-Daten[-zufall]

#Berechnung Bandwith
bwG<-gwr.sel(formula=Ziel~ as.factor(Var1) + log(Var2, base = exp(1)) + Var3, data = Daten90, gweight = gwr.Gauss, verbose = FALSE )
#GWR
gwrG<-gwr(formula=Ziel~ as.factor(Var1) + log(Var2, base = exp(1)) + Var3, data = Daten90,bandwidth = bwG, gweight = gwr.Gauss,hatmatrix = TRUE)
#Predict
Erg<-gwr.predict(formula=Ziel~ as.factor(Var1) + log(Var2, base = exp(1)) + Var3, data = Daten90,predictdata = Daten10,bw = bwG, kernel = "gaussian",adaptive = FALSE, p = 2, theta = 0, longlat = FALSE)
Bis zur Vorhersage mit gwr.predic funktioniert alles. Das Problem besteht in "predictdata". Es kommt folgende Fehlermeldung:

Code: Alles auswählen

Error in gwr.predict(formula = Ziel~ as.factor(Var1) + log(Var2, base = exp(1)) + Var3,  : 
  All the independent variables should be included in the predictdata
Eigentlich sind die Predictdata die Daten10, welche auch alle die unabhängigen Variablen enthalten.
Ein Beispieldatensatz ist im Anhang.
Beispiel.zip
(1.86 KiB) 35-mal heruntergeladen
Hoffentlich könnt ihr mir weiterhelfen!
Viele Grüße, Christoph.

Re: Geographisch gewichtete Regression

Verfasst: Mi Feb 20, 2019 5:26 pm
von EDi
Was sagt
str(Daten10)
str(Daten90)
:?:

Ich würde auch von transformationen (factor, log) innerhalb von formulas abraten und diese vorab machen.

Re: Geographisch gewichtete Regression

Verfasst: Do Feb 21, 2019 4:46 pm
von Christoph
Hallo EDi,

die Transformationen hab ich jetzt mal außerhalb gemacht, der Fehler ist aber noch der selbe.
Die Struktur der Daten sieht folgendermaßen aus:

Code: Alles auswählen

> str(Daten10)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame':	9 obs. of  8 variables:
  .. ..$ OBJECTID  : Factor w/ 99 levels "1","10","11",..: 8 35 57 21 1 49 84 43 92
  .. ..$ Rechtswert: num [1:9] 441472 615272 582221 433241 564153 ...
  .. ..$ Hochwert  : num [1:9] 5891859 5815026 5781240 5893050 5782251 ...
  .. ..$ Var1      : Factor w/ 5 levels "2005","2006",..: 1 3 4 2 1 3 5 3 5
  .. ..$ Var2      : num [1:9] 15 16.5 20 20 6.5 22 37 22 20
  .. ..$ Var3      : num [1:9] 49.6 52.9 29.2 23.8 45.1 ...
  .. ..$ Ziel      : num [1:9] 2.52 2.13 4.41 -1.36 5.82 ...
  .. ..$ Var4      : num [1:9] 2.71 2.8 3 3 1.87 ...
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:9, 1:2] 8.12 10.7 10.2 8 9.94 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:2] "coords.x1" "coords.x2"
  ..@ bbox       : num [1:2, 1:2] 8 52.2 10.7 53.2
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "coords.x1" "coords.x2"
  .. .. ..$ : chr [1:2] "min" "max"
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
> str(Daten90)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame':	90 obs. of  8 variables:
  .. ..$ OBJECTID  : Factor w/ 99 levels "1","10","11",..: 12 23 34 45 56 67 78 89 2 3 ...
  .. ..$ Rechtswert: num [1:90] 491278 562828 580532 469223 549974 ...
  .. ..$ Hochwert  : num [1:90] 5879562 5784511 5919585 5974075 5812418 ...
  .. ..$ Var1      : Factor w/ 5 levels "2005","2006",..: 1 1 1 1 1 1 1 1 1 1 ...
  .. ..$ Var2      : num [1:90] 14 14 25 15 14 18 18 36 6 15 ...
  .. ..$ Var3      : num [1:90] 31.8 39.4 49.3 37.7 42.3 ...
  .. ..$ Ziel      : num [1:90] 2.2 4.3 2.84 2.84 2.68 ...
  .. ..$ Var4      : num [1:90] 2.64 2.64 3.22 2.71 2.64 ...
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:90, 1:2] 8.87 9.92 10.21 8.53 9.74 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:2] "coords.x1" "coords.x2"
  ..@ bbox       : num [1:2, 1:2] 7.04 51.56 10.94 53.94
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "coords.x1" "coords.x2"
  .. .. ..$ : chr [1:2] "min" "max"
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
Var4 ist der log von Var2.
Beispiel.zip
(7.77 KiB) 32-mal heruntergeladen
Viele Grüße,
Christoph

Re: Geographisch gewichtete Regression

Verfasst: Fr Feb 22, 2019 11:54 am
von Athomas
Ich habe Einiges ausprobiert - mein Fazit ist, dass "gwr.predict" offenbar nicht mit Faktoren als Prediktoren zurecht kommt.

Code: Alles auswählen

library(rgdal)
library(spgwr)
library(GWmodel)

Daten    <- readOGR('xxx/Beispiel.shp')
Daten@data$Var1a <- as.factor(Daten@data$Var1)

#Ziehen der zufälligen 10%

zufall   <- sample(1:nrow(Daten),0.1*nrow(Daten),replace = FALSE)
Daten10  <- Daten[zufall,]
Daten90  <- Daten[-zufall]

# Berechnung Bandwith

bwG      <- gwr.sel(formula = Ziel ~ Var1a, 
                    data = Daten90, gweight = gwr.Gauss, verbose = FALSE )

#Predict

Erg      <- gwr.predict(formula = Ziel ~  Var1a, 
                        data = Daten90, predictdata = Daten10, bw = bwG, kernel = "gaussian")
liefert denselben Fehler :(.
An Deiner Stelle würde ich jetzt den Autoren befragen...

Re: Geographisch gewichtete Regression

Verfasst: Mo Feb 25, 2019 10:51 am
von Christoph
Ich habe herausgefunden, dass gwr.predict die falsche Funktion ist.

Die Vorhersage funktioniert folgendermaßen:

Code: Alles auswählen

#Bandwith
bwG<-gwr.sel(formula=Ziel~ Var1 + Var3 + Var4, data = Daten90, gweight = gwr.Gauss, verbose = FALSE )
#GWR
gwrG<-gwr(formula=Ziel~ Var1 + Var3 + Var4, data = Daten90,bandwidth = bwG, gweight = gwr.Gauss,hatmatrix = TRUE)
#Predict
gwrGp <- gwr(formula=Ziel~ Var1 + Var3 + Var4, data = Daten90,bandwidth = bwG, gweight = gwr.Gauss,hatmatrix = TRUE, fit.points=Daten10, predictions=TRUE, fittedGWRobject=gwrG)
Dadurch erhalte ich dann auch meine gewünschten Vorhersagen, jedoch bekomme ich noch folgenden Fehler, wenn ich gwrGp ausgeben will:

Code: Alles auswählen

Error in sqrt(x$results$sigma2.b) :
  non-numeric argument to mathematical function
Weiß jemand woran das liegt?
Christoph

Re: Geographisch gewichtete Regression

Verfasst: Mo Feb 25, 2019 2:45 pm
von Athomas
Ich habe herausgefunden, dass gwr.predict die falsche Funktion ist.
Aha!?

Re: Geographisch gewichtete Regression

Verfasst: Mo Feb 25, 2019 11:59 pm
von jogo
Wer Funktionen fälscht oder gefälschte Funktionen in Umlauf bringt, ...