2017-03-11 33 views
0

我對QGIS很熟悉,但在這裏苦苦掙扎,我想幫助做一些基於地理位置加權的迴歸,其中一些數據基於紐約市PUMA shapefile(55)的質心點點,每個彪馬,這基本上像一個大的人口普查道)。基本地理加權迴歸

這是我在CSV數據: https://www.sendspace.com/file/pj48b5

另外,如果需要的話(可能不是),這裏是shapefile數據: https://www.sendspace.com/file/wbqrpb

正如你可以看到,該表是按以下格式:

lat   lng   variable_a 2015_median 9_yr_change 9_yr_change_new pc_change 
40.8912378 -73.9101365 6   1200  380   480    31.6666666667 
40.8901905 -73.8614272 8   1100  280   200    25.4545454545 
40.8502191 -73.8050669 11   1100  300   530    27.2727272727 
40.8561725 -73.8525618 2   1100  320   205    29.0909090909 

如果我做兩個變量的基本消退,像這樣:

fit <- lm(variable_a ~ X9_yr_change_new, data=s_data) 
summary(fit) 

然後我得到平方的0.42

我想接下來做的就是測試相同的兩個變量的R,而是通過使用緯度和經度變量(質心座標),看看是否有當考慮到這些點的地理鄰近度時,建立更強大的關係。

任何人都可以告訴我在QGIS或R中這樣做的最簡單方法嗎?

回答

2

對於加權迴歸,您必須首先根據位置找到權重。可以通過對每組lat/lngvariable_a響應進行平均,並計數每組中的響應數。這number將成爲ave_var_a的平均響應的權重。然後通過將weights = number傳遞給lm函數進行加權迴歸。

由於您的數據每個位置只有一個響應,所以未加權和加權迴歸的擬合結果是相同的。可以使用summary.aov()函數來看。

我在下面顯示了未加權和加權迴歸。

設置加權數據:

df1 <- read.table(file = 's_data.csv', header = TRUE, sep = ',', stringsAsFactors = FALSE) 
head(df1) 
#  lat  lng variable_a X2015_median X9_yr_change X9_yr_change_new pc_change 
# 1 40.89124 -73.91014   6   1200   380    480 31.66667 
# 2 40.89019 -73.86143   8   1100   280    200 25.45455 
# 3 40.85022 -73.80507   11   1100   300    530 27.27273 
# 4 40.85617 -73.85256   2   1100   320    205 29.09091 
# 5 40.84518 -73.88736   21   850   260    250 30.58824 
# 6 40.86465 -73.90325   2   1000   230    300 23.00000 

library(data.table) 
setDT(df1) 

df1[, 
    j = `:=` (number = .N, # total number of responses per location 
       ave_var_a = mean(variable_a)), # average response per location 
    by = c('lat', 'lng')] 

head(df1) 
#   lat  lng variable_a X2015_median X9_yr_change X9_yr_change_new pc_change number ave_var_a 
# 1: 40.89124 -73.91014   6   1200   380    480 31.66667  1   6 
# 2: 40.89019 -73.86143   8   1100   280    200 25.45455  1   8 
# 3: 40.85022 -73.80507   11   1100   300    530 27.27273  1  11 
# 4: 40.85617 -73.85256   2   1100   320    205 29.09091  1   2 
# 5: 40.84518 -73.88736   21   850   260    250 30.58824  1  21 
# 6: 40.86465 -73.90325   2   1000   230    300 23.00000  1   2 

執行lm未加權和加權迴歸:

# unweighted regression 
fit <- lm(variable_a ~ X9_yr_change_new, data= df1) 
summary.aov(fit) 
#     Df Sum Sq Mean Sq F value Pr(>F)  
# X9_yr_change_new 1 6537830 6537830 39.23 6.89e-08 *** 
# Residuals  53 8833855 166677      
# --- 
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

# weighted regression 
weighted_fit <- lm(ave_var_a ~ X9_yr_change_new, data= df1, weights = number) 
summary.aov(weighted_fit) 
#     Df Sum Sq Mean Sq F value Pr(>F)  
# X9_yr_change_new 1 6537830 6537830 39.23 6.89e-08 *** 
# Residuals  53 8833855 166677      
# --- 
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
+0

嗯......您提供可能用於加權迴歸工作的一個答案,但不適用於地理加權迴歸,因爲沒有關於測量緯度/經度之間距離的說明。另外,從兩個迴歸可以看出,它們給出了相同的回答,因爲計算每個位置的平均金額不會執行任何操作 - variable_a的數據已經計入每個(唯一)位置。所以雖然這個答案可能有助於做其他事情,但對我而言根本無濟於事。儘管如此,感謝您的努力和抱歉,我無法將其標記爲正確。 –

+0

沒問題。希望你找到合適的人 – Sathish

+0

最後我在arcGIS中找到了一個工具來做一個基本的GWR ......我很快就會知道如何在R中做到這一點,但現在已經足夠了! –