I see the problem when I compile the C++ code on Ubuntu 20.04 and the latest R-devel with C++ compiler: ‘g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 If I change all the unadorned 'abs' calls in src/nn_matchC_vec.cpp with the prefix 'std::' the problem goes away.
-Bill On Thu, May 11, 2023 at 11:12 AM Noah Greifer <noah.grei...@gmail.com> wrote: > Hello, > > I'm the mainter of the package *MatchIt*, which uses *Rcpp* to implement > nearest neighbor matching. One way to customize nearest neighbor > matching is to add a caliper, which is the largest distance two units can > be from each other before they are not allowed to be matched. I've had some > users complain recently that the caliper is not working for them, i.e., > even after specifying a caliper, units are being matched who are > farther apart then the caliper width. I have been unable to replicate this > problem on my Mac; the caliper always works as intended. > > One user noted that even when using the same package version, the > performance varied across two machines: one obeyed the caliper and one > didn't. I thought this might be related to the version of R installed, as > for some users updating R fixed the issue, but for others it didn't. I'm > kind of at a loss. > > I have a suspicion that the problem is related to the function abs() in the > C++ functions find_right() and find_left() that I wrote to perform the > matching, which are in nn_match_vec.cpp > <https://github.com/kosukeimai/MatchIt/blob/master/src/nn_matchC_vec.cpp>. > I have had problems with abs() before (seemingly related to a namespace > conflict between std and Rcpp). In this case, abs() is used in the > following way: > > if (abs(distance[ii] - distance[k]) > caliper_dist) { > //if closest is outside caliper, break; none can be found > break; > } > > Here, distance is a NumericVector, and ii and k are ints. My expectation is > that this would dispatch to std::abs() with a double as its input. It's > possible something is going wrong there. I'm wondering if this has to do > with recent changes to R's C++ engine or compilers. > > If you want to run code to test whether the caliper is working correctly on > your machine, you can run the following code: > > install.packages("MatchIt") > data("lalonde", package = "MatchIt") > m <- MatchIt::matchit(treat ~ age + educ + race + re74, > data = lalonde, caliper = .01) > summary(m)$nn > > If the caliper is working correctly, you should see a small matrix that has > the row > > Matched 88 88 > > If not, you would see the row > > Matched 185 185 > > The GitHub issue of people complaining about this is here > <https://github.com/kosukeimai/MatchIt/issues/163> along with their > explanations about versions of *MatchIt* and R. The package code is also > there. > > Any thoughts or insights about this would really help! Thank you so much! > > Noah > > [[alternative HTML version deleted]] > > ______________________________________________ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > [[alternative HTML version deleted]] ______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel