Roy finished with 24 points to help the Trail Blazers win for the ninth time after trailing at the start of the fourth quarter.
Wade tied his own franchise record by scoring 17 consecutive Heat points, and he set a team record for points in a third quarter with 20 to help Miami take a 76-69 lead to start the fourth quarter.
But Wade scored only two points in the final period, when he went 1-for-7, including a miss that would have tied the game with less than 2 minutes left.
Roy scored nine points during a 14-0 run that put Portland ahead 88-78. Miami managed only one field goal in the first 7 1/2 minutes of the final period.
The Blazers regained sole possession of first place in the Northwest Division, a half-game ahead of Denver, and improved to 7-12 on the road. They're 17-3 at home.
After Miami's Jason Williams sank a 3-pointer with 2:01 left to cut Portland's lead to 90-88, the Heat forced a turnover. But Udonis Haslem and Wade missed shots, and Travis Outlaw sank a jumper for Portland, before James Jones hit a clinching 3-pointer.
Outlaw finished with 18 points for the Blazers, who made 25 of 31 free throws and had 10 more rebounds than the Heat.
Miami's Shaquille O'Neal had 20 points and 11 rebounds in his second start after missing eight games with a hip injury. But the Heat's longest losing streak since late 2001 continued. They last won on Dec. 22.