Geographisch gewichtete Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
Christoph
Beiträge: 7
Registriert: Sa Jan 26, 2019 2:01 pm

Geographisch gewichtete Regression

Beitrag 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.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Geographisch gewichtete Regression

Beitrag von EDi »

Was sagt
str(Daten10)
str(Daten90)
:?:

Ich würde auch von transformationen (factor, log) innerhalb von formulas abraten und diese vorab machen.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Christoph
Beiträge: 7
Registriert: Sa Jan 26, 2019 2:01 pm

Re: Geographisch gewichtete Regression

Beitrag 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
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Geographisch gewichtete Regression

Beitrag 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...
Christoph
Beiträge: 7
Registriert: Sa Jan 26, 2019 2:01 pm

Re: Geographisch gewichtete Regression

Beitrag 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
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Geographisch gewichtete Regression

Beitrag von Athomas »

Ich habe herausgefunden, dass gwr.predict die falsche Funktion ist.
Aha!?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Geographisch gewichtete Regression

Beitrag von jogo »

Wer Funktionen fälscht oder gefälschte Funktionen in Umlauf bringt, ...
Antworten