【问题标题】:Basic geographically weighted regression基本地理加权回归
【发布时间】:2017-03-12 19:29:13
【问题描述】:

我对 QGIS 很熟悉,但在这里遇到了 R,我想要一些帮助来使用一些基于纽约市 PUMA shapefile 质心点的数据进行基本的地理加权回归(55 点,一个用于每个 PUMA,基本上就像一个大的人口普查区)。

这是我在 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 平方

接下来我要做的是测试相同的两个变量,但通过使用 lat 和 lng 变量(质心的坐标)来查看当考虑到这些点的地理邻近性时是否存在更强的关系帐户。

谁能告诉我在 QGIS 或 R 中最简单的方法?

【问题讨论】:

    标签: r regression qgis


    【解决方案1】:

    对于加权回归,您必须首先根据位置找到权重。可以通过对每组lat/lng 的variable_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
    

    【讨论】:

    • 嗯...您提供的答案可能适用于加权回归,但不适用于地理加权回归,因为没有考虑测量纬度/经度之间的距离。此外,正如您从两个回归中看到的那样,它们给出了相同的响应,因为计算每个位置的平均数量没有任何作用 - variable_a 的数据已经为每个(唯一)位置计算在内。因此,虽然这个答案可能有助于做其他事情,但对我来说根本没有帮助。不过,感谢您的努力,很抱歉我无法将其标记为正确。
    • 最后我在 arcGIS 中找到了一个工具来做一个基本的 GWR ......我很快就会知道如何在 R 中做到这一点,但这已经足够了!
    • 有答案后请留言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2010-12-29
    • 2018-03-14
    • 2015-06-15
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多